Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在保留斯堪的纳维亚字母的同时为SQLite正确编码NSString_Objective C_Ios_String_Sqlite_Nsstring - Fatal编程技术网

Objective c 如何在保留斯堪的纳维亚字母的同时为SQLite正确编码NSString

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\

我目前正在开发一款具有全文搜索功能的IOS应用程序。搜索是通过在sqlite数据库上执行select语句来执行的,但问题是数据库中的许多值都包含斯堪的纳维亚字母Æ、Ö、Á等,我在转换语句时遇到了问题,无法获取字母的十六进制值

以下是我目前正在做的事情:

 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之后,我仍然没有得到结果。正如您所说,我可能需要创建一个自定义标记器。