Objective c 如何在保留斯堪的纳维亚字母的同时为SQLite正确编码NSString
我目前正在开发一款具有全文搜索功能的IOS应用程序。搜索是通过在sqlite数据库上执行select语句来执行的,但问题是数据库中的许多值都包含斯堪的纳维亚字母Æ、Ö、Á等,我在转换语句时遇到了问题,无法获取字母的十六进制值 以下是我目前正在做的事情:Objective c 如何在保留斯堪的纳维亚字母的同时为SQLite正确编码NSString,objective-c,ios,string,sqlite,nsstring,Objective C,Ios,String,Sqlite,Nsstring,我目前正在开发一款具有全文搜索功能的IOS应用程序。搜索是通过在sqlite数据库上执行select语句来执行的,但问题是数据库中的许多值都包含斯堪的纳维亚字母Æ、Ö、Á等,我在转换语句时遇到了问题,无法获取字母的十六进制值 以下是我目前正在做的事情: const char *sql = [[NSString stringWithFormat: @"SELECT %@\ FROM Customer c\
const char *sql = [[NSString stringWithFormat:
@"SELECT %@\
FROM Customer c\
JOIN Customer_Metadata cm ON c.CustomerId = cm.CustomerId\
WHERE cm.Name LIKE '%%%@%%'\
ORDER BY cm.Name", kCustomerSelect, searchString] UTF8String];
现在kCustomerSelect是一个常量,包含我要选择的列,searchString包含用户输入
这就像普通拉丁字母的符咒,但如果我以搜索字符串的形式传递Ö,我会得到st\xc3\xb6。我知道,仅仅注销一个UTF8编码的字符串不会给出正确的字符串表示形式,但问题是select语句没有给出任何结果
我在执行查询之前调用sqlite3_open,并从SQLite文档中调用*如果调用sqlite3_open或sqlite3_open_v2,则数据库的默认编码将为UTF-8,如果使用sqlite3_open16,则为本机字节顺序的UTF-16。*
我尝试使用不同的编码,用cStringUsingEncoding:替换UTF8String,并尝试不同的编码。它们都没有起作用,这不是我所期待的,但至少我想尝试一下
任何和所有的帮助,或提示,将不胜感激
编辑
我现在尝试使用SQLite数据库浏览器在数据库上运行相同的select语句,但没有得到任何结果。
这让我相信这可能与我使用FTS3创建Customer_元数据表有关
德累斯顿先生这样写你的查询:
const char *sql = [[NSString stringWithFormat:
@"SELECT %@\
FROM Customer c\
JOIN Customer_Metadata cm ON c.CustomerId = cm.CustomerId\
WHERE cm.Name LIKE ?\
ORDER BY cm.Name", kCustomerSelect] UTF8String];
准备语句后,绑定searchString:
sqlite3_bind_text(statement, 1, [[NSString stringWithFormat:@"%%%@%%", searchString] UTF8String], -1, SQLITE_TRANSIENT);
只要数据库是UTF-8,就可以输入希腊语、俄语、日语文本,当然还可以使用各种斯堪的纳维亚字符
编辑:我刚看到你的编辑。如果数据创建不正确,那肯定是一个问题。如果您使用的是FTS3,默认的标记器将不会执行您想要的操作 除非在用于创建FTS表的CREATE VISUAL TABLE语句中指定了特定的标记器,否则将使用默认的标记器simple。简单标记器根据以下规则从文档或基本FTS全文查询中提取标记: 术语是合格字符的连续序列,其中合格字符均为字母数字字符和Unicode码点值大于或等于128的所有字符。将文档拆分为术语时,将丢弃所有其他字符。他们唯一的贡献就是把相邻的术语分开 -
您将需要使用自定义标记器,或者查看icu或unicode61标记器是否适合您。上述链接文档中提供了这些信息。谢谢您的帮助。我试过你的建议,但还是没有收到特殊信件的结果。我真的开始认为我需要为我的FTS3表找到一个特殊的tokanizer。只是一个暂时忽略眼前问题的旁注-你应该在字符串格式上使用sqlite\u bind\u xxx的原因是sqlite\u bind\u xxx正确地处理了字符串值包含引号这样的情况。Is还解决了SQL注入攻击。祝FTS问题好运。遗憾的是,在尝试了ICU和Unicode61之后,我仍然没有得到结果。正如您所说,我可能需要创建一个自定义标记器。