我一直在通过网络彻底查看,我似乎无法找到这种转换的表格。我找到的那些有一些错误,并且不太可靠,所以我找了一些官方的桌子或类似的,但不幸的是我没有..所以我在这里..
正如标题中所提到的,我想要做的是,例如,知道“ñ”代表什么(这个我已经知道......“ñ”),但不仅仅是西班牙人,而是其他人(我已经知道波兰语了。)
主要问题是我在PHP中有一个字符串,有时候可能会出现例如“eñe”(这是正常的)而其他人则称为“eñe”..而在最后我应该可以将其更改为“ eñe“所以它是可读的..但如果没关系,我不想改变它。为了做到这一点,我使用的是utf8_decode函数,但是如果字符串是可读的,它仍然会将“ñ”更改为“■”(但是白色)..这就是为什么我不能总是解码字符串,并且如果我使用mb_detect_encoding函数,我将始终将“UTF-8”作为响应...并且它没那么有用..
一旦我知道所有的utf8位字符,例如“ñ”代表“ñ”,“Ź”代表“Ź”等,我打算做一个基本上互相替换的功能。 。这与utf8_decode的功能相同......除非有人在这里有更好的解决方案!
提前致谢! 问候!
答案 0 :(得分:9)
你为什么要这样做?您想要恢复损坏的数据吗?
它确实不应该作为通常业务代码流的一部分来完成。您需要做的就是确保您的webapp的所有层都正确使用UTF-8。 PHP源代码,HTTP响应头和正文,数据库表,数据库连接等等。另请参阅PHP UTF-8 cheatsheet。
如果实际想要将此作为一次性任务来恢复损坏的数据,那么最好知道问题中的损坏数据表明UTF-8数据被错误地存储了或显示为ISO-8859-1。您只需要将数据读取为ISO-8859-1并写为UTF-8。一度。然后以正确的方式做。
作为证据,ñ
(Unicode Character 'LATIN SMALL LETTER N WITH TILDE' (U+00F1))存在于字节0xC3
和0xB1
的Unicode(UTF-8,多字节编码)中。当使用像ISO-8859-1这样的单字节编码对这些字节进行编码时,0xC3
变为Ã
,0xB1
变为±
。另请参阅ISO-8859-1 codepage layout。
答案 1 :(得分:4)
问题是,一旦你有了mojibake,就没有可靠的方法将它转换回它应该意味着什么。有关问题的解释,请参阅this paragraph at Wikipedia:
考虑在ISO-8859-1编码中包含德语单词für的文本文件。现在使用文本编辑器打开此文件,该编辑器假定输入为UTF-8。由于第一个字节(
0x66
)位于0x00
-0x7F
范围内,因此UTF-8会将其正确解释为f
。第二个字节(0xFC
)不是任何UTF-8编码字符开头的合法值。因此,文本编辑器可以用替换字符符号替换该字节,以警告用户出错。最后一个字节(0x72
)也在代码范围0x00
-0x7F
内,可以正确解码。整个字符串现在显示如下:f�r
。实施不佳的文本编辑器可能会以UTF-8格式保存替换;然后,文本文件数据将如下所示:
0x66 0xEF 0xBF 0xBD 0x72
,它将再次显示在ISO-8859-1中f�r
。 替换也会破坏原始字节,因此无法恢复所需的字符。
您需要避免从一开始就使用错误的编码错误地解释文本。当它被打破时修复它已经太晚了。
答案 2 :(得分:0)
您的问题比转码更难解释。 在任何现代计算机上,ñ通常作为二进制0xc3b1输入,因为它是UTF-8代码。如果你在旧的iso-latin-15代码中解释(没有转码),你将得到0xc3 =Ã,然后是0xb1 =±。 这就是为什么没有“表格”:这是一个显示问题。
最好的办法是完全避免使用iso-latin。它会给你带来很多问题。修复程序的真正方法是:在任何地方只使用utf-8,它将为您节省大量时间和麻烦。
与此同时,如果你真的想要获取等效的iso-latin-15字符串到你的utf-8输入(如果你没有,你可以获得上面的权利),你可以将你的字符串传递给任何代码转换器,要求它将utf-8转换为iso-latin-15 。 你应该注意的一件事是双转码。如果你有一个utf-8字符串并且错误地要求从iso-lating-15转换为utf-8,那么你得到一个utf-8字符串实际上是,它是二进制0xc383c2b1。要获得正确的utf-8字符串,anwser是相同的:要求将损坏的字符串从utf-8转换为iso-latin-15,这将很高兴地将0xc383转换为0xc3,然后将其转换为0xc2b1并将其转换为0xb1,为您提供正确的utf-8字符串,其中包含正确的ñ。
特别是对于PHP和Web应用程序,请记住许多计算机(以及将来会越来越多)默认情况下会向您发送utf-8。