我有以下地址: 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,
知道为什么ě没有被解码?
答案 0 :(得分:14)
utf8_decode
将字符串从UTF-8编码转换为ISO-8859-1,a.k.a。“Latin-1”。
Latin-1编码不能代表字母“ě”。就这么简单。
“解码”是一个用词不当,它与iconv('UTF-8', 'ISO-8859-1', $string)
完全相同。
答案 1 :(得分:0)
你不需要那个(@Rajeev:这个字符串被自动检测为utf-8编码:
echo mb_detect_encoding('Praha 5, Staré Město,');
将始终返回UTF-8。)。
答案 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