相同的字符显示差异Hex代码

时间:2014-04-07 07:30:12

标签: ios objective-c unicode nsstring

unichar c1 = 12098;
unichar c2 = 25991;

当我打印时此字符显示以下值,

(unichar) $2 = U+2f42 u'⽂'
(unichar) $3 = U+6587 u'文'

相同的字符,但不同的十六进制代码。我想在这种不同的编码中识别相似的字符。像吼叫一样

if(c1 == c2){
}

实际情况比这更复杂。一组文本是使用字形从pdf文件编码中提取的文本,另一组是搜索文本字。

提前致谢。

2 个答案:

答案 0 :(得分:1)

这很难解释。 NSString和Unicode下隐藏的内容比人们想象的要多得多。一些(视觉上相同的)角色可以有多个表示。

我建议您在objc.io阅读这两篇精彩的文章,这些文章将深入解释您的问题:

答案 1 :(得分:1)

  

相同的字符但不同的十六进制代码。

相当相同的字符。一个是中文写作;另一个是指许多相关词语所使用的词根。这就像字母'I'和'I'这两个字的区别。

差异非常小,以至于Unicode宁愿不关心它,但必须具备兼容性。基础U + 2F42与另一种形式具有“兼容性分解”,因此您可以通过将两个字符串归一化为Normal Form KD来比较它们。在NSString中,操作是decomposedStringWithCompatibilityMapping

  

我想识别相似的字符

这可能是一个更广泛的问题 - 需要查看更多示例,以确定单独的兼容性规范化是否能满足您的需求。

识别通常看起来相似的角色是一项开放式任务。例如,否则与其他无关的希腊语ν(nu)和拉丁语v匹配?数字0对字母O怎么样?

Unicode TR39对于通常在视觉上相似的字符具有confusables的概念,其针对安全问题但可能有所帮助。 NSString没有内置任何内容来比较这些,所以你必须下载confusables.txt并自己进行逐个字符映射。