Swift中SQLite.swift库俄语符号LIKE查询及ICU库集成求助
解决SQLite.swift中俄语字符大小写匹配失效的问题
哈哈,这个问题我之前踩过坑!刚好能给你捋清楚怎么解决——核心就是给SQLite启用ICU扩展,然后在SQLite.swift里用对应的函数来替代默认的lowercaseString。
一、先给SQLite.swift装上ICU支持
默认的SQLite.swift不带ICU扩展,所以得先确保安装的时候开启这个功能:
如果你用CocoaPods,直接修改Podfile:
pod 'SQLite.swift', :git => 'https://github.com/stephencelis/SQLite.swift.git', :branch => 'master', :subspecs => ['ICU']
然后跑pod install重新安装,这样库就会编译带ICU扩展的版本。要是你手动编译的话,记得给SQLite加上SQLITE_ENABLE_ICU编译选项,还要链接ICU库。
二、改代码用ICU的大小写转换函数
启用ICU后,SQLite会提供专门的icu_lower()函数,能正确处理俄语这类非ASCII字符的大小写转换。我们在SQLite.swift里给字符串表达式加个扩展,方便调用:
extension Expression where Value == String { var icuLower: Expression<String> { return Function("icu_lower", [self]) } }
然后把你的查询代码改成这样:
// 数据库中name字段值为:ПРИВЕТ let search_name = "Привет" // 用自定义的icuLower替换原来的lowercaseString user.filter(name.icuLower.like("%" + search_name.lowercased() + "%"))
这样就能完美匹配俄语的大小写了!
额外提醒
- 别忘确认你的数据库连接是用带ICU的SQLite.swift创建的,别混着用不同版本的库。
- 已经存在的数据库不用迁移,只要查询时换成
icu_lower就行。 - 这个方法不止适用于俄语,其他非ASCII语言(比如欧洲小语种、阿拉伯语)的大小写转换也能搞定。
内容的提问来源于stack exchange,提问作者Wolfak
相关产品推荐
相关产品推荐

