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

时间:2012-10-31 16:25:31

标签: objective-c ios string sqlite nsstring

我目前正在开发一款具有全文搜索功能的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包含用户输入。

这就像普通拉丁字母的魅力一样,但如果我传递Ö,作为searchString,我得到st \ xc3 \ xb6。我知道简单地注销UTF8编码的字符串将无法正确表示字符串,但问题是我的select语句没有给我任何结果。

我在执行查询之前调用sqlite3_open()并从SQLite文档中调用*“如果调用sqlite3_open()或sqlite3_open_v2()并且本机字节中的UTF-16,则数据库的默认编码为UTF-8如果使用sqlite3_open16(),请订购。“*。

我尝试将UTF8String替换为cStringUsingEncoding:并尝试使用不同的编码,从而尝试使用不同的编码。他们都没有工作(不是我期待他们,但至少想尝试)。

任何和所有帮助或提示都将不胜感激。

修改 我现在尝试使用SQLite数据库浏览器在数据库上运行相同的select语句,但没有得到任何结果。 这让我相信这可能与我使用FTS3创建我的Customer_Metadata表有关。

MrDresden

2 个答案:

答案 0 :(得分:0)

像这样写下你的查询:

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,您就可以输入希腊语,俄语,日语,当然还有各种斯堪的纳维亚语字符。

编辑:我刚看到你的编辑。如果数据没有正确创建,那肯定是个问题。

答案 1 :(得分:0)

如果您使用的是FTS3,则默认的标记生成器将无法执行您想要的操作。

  
    
      

除非将特定的tokenizer指定为用于创建FTS表的CREATE VIRTUAL TABLE语句的一部分,否则将使用默认的tokenizer“simple”。简单的标记化器根据以下规则从文档或基本FTS全文查询中提取标记:

             

术语是符合条件的连续符号序列,其中符合条件的字符都是字母数字字符,Unicode代码点值大于或等于128的所有字符。将文档拆分为术语时,将丢弃所有其他字符。他们唯一的贡献是将相邻的术语分开。

    
  

- http://www.sqlite.org/fts3.html#tokenizer

您需要使用自定义标记生成器,或查看icu或unicode61标记生成器是否适合您。有关这些的信息都在上面链接的文档中。