我对 utf8 编码有一个小问题。我尝试编码的词是“kühl”。所以它有一个特殊的字符。
当我在第一个文件中用 utf8 编码这个字符串时,我得到:
科尔
当我在第二个文件中用 utf8 编码这个字符串时,我得到:
库尔
使用 php utf8_encode() 我总是将第一个 (kühl) 作为输出,但我需要第二个作为输出 (kuÌ�hl)。
mb_detect_encoding 告诉我它是“UTF-8”,所以这并没有真正的帮助。
你有什么想法让第二个作为输出吗?提前致谢!
我对 utf8 编码有一个小问题。我尝试编码的词是“kühl”。所以它有一个特殊的字符。
当我在第一个文件中用 utf8 编码这个字符串时,我得到:
科尔
当我在第二个文件中用 utf8 编码这个字符串时,我得到:
库尔
使用 php utf8_encode() 我总是将第一个 (kühl) 作为输出,但我需要第二个作为输出 (kuÌ�hl)。
mb_detect_encoding 告诉我它是“UTF-8”,所以这并没有真正的帮助。
你有什么想法让第二个作为输出吗?提前致谢!
只有一种编码称为 UTF-8,但有多种方法可以在 Unicode 中表示某些字形。 U+00FC是拉丁语 1 兼容性单字形预组合 ü,在拉丁语 1 中显示为 kühl 而从我的头顶kuÌ�hl 看起来像是同一个字符的完全分解的表达式,即U+0075 (u) 后跟U+0308(组合分音符号)。另见http://en.wikipedia.org/wiki/Unicode_equivalence#Normalization
vbvntv$ perl -CSD -le 'print "ku\x{0308}hl"' | iconv -f latin1 -t utf8
ku�hl
vbvntv$ perl -CSD -le 'print "ku\x{0308}hl"' | xxd
0000000: 6b75 cc88 686c 0a ku..hl.
0x88 不是 Latin-1 中的有效字符,因此(在我的浏览器中)它显示为“无效字符”占位符(带有白色问号的黑色菱形),而其他人可能会看到其他内容,或者什么也看不到。
显然,您可以使用class.normalize
PHP 在这两种形式之间进行转换:
$normalized = Normalizer::normalize($input, Normalizer::FORM_D);
顺便说一句,将 UTF8 视为 Latin-1 并复制/粘贴表示,就好像它是实际的真实文本一样,充其量是反复无常的。如果您有字符编码问题,实际字节(例如,十六进制)是表达您所拥有内容的唯一可移植、可理解的方式。在许多情况下,您的计算机如何呈现它是不可预测的,尤其是当编码有问题或未知时。我坚持您在问题中使用的演示文稿,但是如果您还有其他问题,请注意明确地阐明问题。
utf8_encode,尽管它的名字,并没有神奇地编码成 UTF-8。
只有当您的来源是 ISO-8559-1(也称为 latin-1)时,它才会起作用。
如果您的源已经是 UTF-8 或任何其他编码,它将输出损坏的数据。