【问题标题】:Charset comparison [closed]字符集比较
【发布时间】:2012-12-27 10:45:08
【问题描述】:

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

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

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

希望两者都能成为解决方案。

【问题讨论】:

  • 这是一个很好的问题,但不是关于字符集的。它是关于比较 Ascii 字符串和全角字符的字符串。

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


【解决方案1】:

在您的字符串中,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 脚本作为过滤器应用 Unicode NFKC (Unicode Normalization Form KC) 将这些奇怪的字符转换回正常字符(它接受 UTF-8 并输出规范化的 UTF-8):

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

在php中:

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

需要intl extension

【讨论】:

  • 一个好的分析和一个好的解决方案,但取决于作为一个整体的数据,转换为 NFKC 也丢弃许多其他区别可能很重要,而不仅仅是 Ascii 字母和它们的完整字母之间的区别-宽度对应物。例如,微符号 µ 和希腊小写字母 mu μ 之间的区别,或者省略号字符“...”和三个句点“...”之间的区别。
  • 有人在东亚输入了那个字符串。这些字形的存在是为了保持西方和亚洲单词中的字母间距一致。
  • 我还是不能处理这个。尽管在 WAMP 服务器中启用了 intl 扩展,但似乎无法正常工作。我用了其他方法:
  • 我还是不能处理这个。尽管在 WAMP 服务器中启用了 intl 扩展,但似乎无法正常工作。我使用了其他方法:$translit = iconv('UTF-8', 'ASCII//TRANSLIT', $str)。但是我不确定它是否安全。这会规范化但不会从 ASCII 转换为全宽拉丁大写字母。具体来说,我需要在 MySQL 中选择 SADI== SADI 的那一行,也就是说需要将 SADI 转换为 SADI。还是有其他解决方案?请帮帮我,我受够了整天搜索...是的,实际上事情有点复杂。字符串包含韩文字符,看起来:$str = "SADI탐요"
  • @user1971424 只是让 intl 工作...您在启用扩展后重新启动服务器了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 2013-05-06
  • 2013-04-06
  • 1970-01-01
  • 2012-06-04
  • 2011-07-06
相关资源
最近更新 更多