【问题标题】:PHP Utf8 Decoding IssuePHP Utf8 解码问题
【发布时间】:2013-06-17 03:48:05
【问题描述】:

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

我需要对这个字符串使用 utf8_decode() 函数,然后才能将它写入 PDF 文件(使用 domPDF lib)。

但是,上述地址行的 php utf8 解码函数似乎不正确(或者更确切地说,不完整)。

以下代码:

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

产生这个:

布拉格 5, Staré M?sto,

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

【问题讨论】:

  • utf8_decode 只是转换一个以 UTF-8 编码的字符串,你的字符串是 utf8_encoded 吗?

标签: php utf-8 character-encoding


【解决方案1】:

utf8_decode将字符串从 UTF-8 编码转换为 ISO-8859-1,也就是“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

【讨论】:

  • 感谢最佳答案 (2015) +1
  • @deceze utf8_decode converts the string from a UTF-8 encoding to ISO-8859-1 这可能节省了我几个小时!如果你在我们的办公室,我很乐意请你喝一杯:)
【解决方案2】:

问题出在您的PHP文件编码中,将文件保存为UTF-8编码,然后甚至不需要使用utf8_decode,如果您从数据库中获取这些数据'Praha 5, Staré Město,',最好将其字符集更改为UTF-8

【讨论】:

    【解决方案3】:
    【解决方案4】:

    我最终使用了自制的 UTF-8 / UTF-16 解码功能(转换为 number; 表示),我没有找到任何模式来解释为什么没有检测到 UTF-8,我怀疑它是因为“编码为”序列并不总是在返回的字符串中完全相同的位置。您可能会对此进行一些额外的检查。

    三字符 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多