代码之家  ›  专栏  ›  技术社区  ›  Mathew

UTF-8到ISO-8859-1编码问题

  •  1
  • Mathew  · 技术社区  · 15 年前

    我正在尝试从另一个网站的RSS订阅源预览最新的文章。订阅源是UTF-8编码的,而网站是ISO-8859-1编码的。显示标题时,我正在使用;

     $post_title = 'Blogging – does it pay the bills?';
    
     echo mb_convert_encoding($post_title, 'iso-8859-1','utf-8');
    
     // returns: Blogging ? does it pay the bills?
     // expected: Blogging - does it pay the bills?
    

    请注意,我期待的连字符不是一个正常的减号,而是一些大屁股超级破折号。好吧,反正再长几个像素。:)不知道如何描述它,因为我的键盘不能产生那个字符…

    4 回复  |  直到 13 年前
        1
  •  3
  •   HoLyVieR    13 年前

    我怀疑你的意思是长划。iso-8859-1不包含这个字符,所以将它转换成那个编码不会有太大的运气。

    你可以使用 htmlentities() 但是我建议把ISO-8859-1改成UTF-8出版。

        2
  •  5
  •   Peter Bailey    15 年前

    mb_convert_encoding 只转换内部编码-它不会实际地将字符的字节序列从一个字符集更改为另一个字符集。为了你需要的 iconv .

    mb_internal_encoding( 'UTF-8' );
    ini_set( 'default_charset', 'ISO-8859-1' );
    
    $post_title = 'Blogging — does it pay the bills?'; // I used the actual m-dash here to best mimic your scenario
    
    echo iconv( 'UTF-8', 'ISO-8859-1//TRANSLIT', $post_title );
    

    或者,正如其他人所说,只是将超出范围的字符转换为HTML实体。

        3
  •  3
  •   Gumbo    15 年前

    我想应该是:

    • 您的文件实际上是用UTF-8编码的
    • 您的编辑器使用Windows-1252解释文件

    原因是你的 EM破折号 字符(U+2014)表示为 – . 这正是您在用该字符(0xe28094)解释该字符的utf-8代码字时得到的结果。 Windows-1252 (0xe2= â ,0x80= € ,0x94= ” )所以您首先需要修复编辑器编码。

    以及 ? 在您的输出中,ISO 8859-1不包含 EM破折号 性格。

        4
  •  1
  •   slikts    15 年前

    它可能是一个长划线(U+2014),你要做的是不转换编码,因为连字符是一个不同的字符。换句话说,您希望搜索这些字符并手动替换它们。

    更好的是,只需将网站切换到UTF-8。这在很大程度上与拉丁语1一致,更适合于2009年的网站。