在sqlite中制作标准化版本的字符串 - 波兰字符ł

时间:2013-04-24 08:28:02

标签: objective-c database string sqlite

Apple提供了在数据库中创建附加列的示例,其中包含存储在数据库中的标准化文本版本: DerivedProperty

有一个函数normalizeString,它包含代码:

NSMutableString *result = [NSMutableString stringWithString:unprocessedValue];

CFStringNormalize((CFMutableStringRef)result, kCFStringNormalizationFormD);
CFStringFold((CFMutableStringRef)result, kCFCompareCaseInsensitive | kCFCompareDiacriticInsensitive | kCFCompareWidthInsensitive, NULL); 

我测试了这个方法,并且有一个将文本转换为规范化版本的示例: ąĄćłŁÓŻźŃĘęĆ - > aacłłozzneec

除字符外,所有变音字符都已正确更改:łŁ

还有其他选项可以进行正确的规范化吗?

1 个答案:

答案 0 :(得分:7)

我不会说波兰语,所以我的回答可能非常错误,但根据http://www.unicode.org/Public/6.2.0/ucd/UnicodeData.txt,字符“ł”和“Ł”不是 “普通”字符与变音符号的组合。

Unicode数据文件中“±”的条目是

0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104

和第六个字段“0061 0328”表示“±”可以分解为“a”和U + 0328(COMBINING OGONEK)。

但“ł”和“Ł”的条目是

0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142;
0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141

其中第六个字段为空,因此这些字符没有分解。

因此,我怀疑是否会有任何将“ł”归一化为“l”的功能,以及你 必须使用

来做到这一点
[result replaceOccurrencesOfString:@"ł" withString:@"l" options:0 range:NSMakeRange(0, [result length])];