Charset比较

时间:2013-01-13 09:06:32

标签: unicode character-encoding normalization unicode-normalization text-normalization

我需要紧急帮助。我无法比较charset字符串。写入数据库table1的字符串是utf-8 charset,但看起来仍然很奇怪:SADI 但是,在同一数据库中写入table2的字符串是SADI,这是正常的。 每当我比较两者时,它都会给出错误。

  1. 知道如何进行比较吗? (实际比较应该给出真实的结果)

  2. 知道如何将SADI作为SADI插入数据库。

  3. 希望这两种方法都是一种解决方案。

1 个答案:

答案 0 :(得分:2)

在字符串中,SADI是标准的ASCII字符串,但SADI使用的是全角Unicode字符。

例如,U+FF33 'FULLWIDTH LATIN CAPITAL LETTER S'(UTF-8:0xEF 0xBC 0xB3),

S是标准ASCII U+0053 'LATIN CAPITAL LETTER S'(UTF-8 0x53)。

其他字符也是类似的扩展Unicode字符,看起来像标准的拉丁字母,但实际上并非如此。

他们是如何到达那里的 - 这是一个很好的问题。可能有人真的有创意并且从Word中复制粘贴了一些东西?谁知道呢。

你可以通过使用这个Perl脚本作为过滤器(它接受UTF-8并输出规范化的UTF-8)来应用Unicode NFKC(Unicode Normalization Form KC)将这些奇怪的字符转换回正常字符:

use Unicode::Normalize;
binmode STDIN,  ':utf8';
binmode STDOUT, ':utf8';
while(<>) { print NFKC($_); }

在php中:

$result = Normalizer::normalize( $str, Normalizer::FORM_KC );

需要intl extension