PHP Utf8解码问题

时间:2013-06-20 10:15:48

标签: php utf-8 character-encoding

我有以下地址: Praha 5,StaréMěsto,

我需要在此字符串上使用utf8_decode()函数才能将其写入PDF文件(使用domPDF lib)。

但是,上述地址行的php utf8解码功能显示不正确(或更确切地说,不完整)。

以下代码:

<?php echo utf8_decode('Praha 5, Staré Město,'); ?>

产生这个:

  

Praha 5,StaréM?sto,

知道为什么ě没有被解码?

4 个答案:

答案 0 :(得分:14)

utf8_decode 字符串从UTF-8编码转换为ISO-8859-1,a.k.a。“Latin-1”。
Latin-1编码不能代表字母“ě”。就这么简单。
“解码”是一个用词不当,它与iconv('UTF-8', 'ISO-8859-1', $string)完全相同。

请参阅What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text

答案 1 :(得分:0)

你不需要那个(@Rajeev:这个字符串被自动检测为utf-8编码:

echo mb_detect_encoding('Praha 5, Staré Město,');

将始终返回UTF-8。)。

你宁愿看到: https://code.google.com/p/dompdf/wiki/CPDFUnicode

答案 2 :(得分:0)

我使用自行开发的UTF-8 / UTF-16解码功能(转换为&amp; #number;表示),我还没有找到任何模式来解释为什么没有检测到UTF-8,我怀疑这是因为“encoded-as”序列并不总是完全位于返回的字符串中的相同位置。您可以对此进行一些额外的检查。

三字符UTF-8指示符:$ startutf8 = chr(0xEF).chr(187).chr(191); (如果你看到这个,不仅仅是前三个字符,字符串是UTF-8编码的)

根据UTF-8规则解码;这取代了早期版本,它逐字节地使用

function charset_decode_utf_8 ($string) {
/* Only do the slow convert if there are 8-bit characters */
/* avoid using 0xA0 (\240) in ereg ranges. RH73 does not like that */
if (! ereg("[\200-\237]", $string) and ! ereg("[\241-\377]", $string))
    return $string;

// decode three byte unicode characters
$string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e",       
"'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",   
$string);

// decode two byte unicode characters
$string = preg_replace("/([\300-\337])([\200-\277])/e",
"'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'",
$string);

return $string;
}

答案 3 :(得分:0)

问题在于您的PHP文件编码,以UTF-8编码保存文件,如果从数据库中获取这些数据utf8_decode,则甚至无需使用'Praha 5, Staré Město,',更好地更改它charset到UTF-8