不同的utf8编码?

时间:2013-04-10 13:45:03

标签: php utf-8 character-encoding

我是utf8编码的一个小问题。 我尝试编码的单词是“kühl”。 所以它有一个特殊的角色。

当我在第一个文件中使用utf8对此字符串进行编码时,我得到:

kühl

当我在第二个文件中使用utf8对此字符串进行编码时,我得到:

kuÌhl

使用php utf8_encode()我总是得到第一个(kÃhl)作为输出,但我需要第二个作为输出(kuÌ hl)。

mb_detect_encoding告诉我两者都是“UTF-8”,所以这没有用。

你有什么想法让第二个作为输出吗? 提前谢谢!

2 个答案:

答案 0 :(得分:4)

只有一种名为UTF-8的编码,但有多种方法可以用Unicode表示某些字形。 U+00FC是Latin-1兼容性单字形预组合ü在Latin-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);

通过by,将UTF8视为Latin-1并将表示复制/粘贴,就好像它是真正的真实文本一样充满了反复无常。如果您有字符编码问题,实际字节(例如,以十六进制表示)是表达您所拥有的唯一可移植,可理解的方式。在许多情况下,计算机如何呈现它是不可预测的,尤其是在编码有问题或未知时。我坚持你在问题中使用的演示文稿,但如果你有其他问题,请注意明确地阐明问题。

答案 1 :(得分:0)

utf8_encode,尽管它的名字,但并没有神奇地编码成UTF-8。

如果您的来源是ISO-8559-1,也称为latin-1,它将起作用。

如果您的来源已经是UTF-8或任何其他编码,则会输出损坏的数据。