utf-8到iso-8859-1编码问题

时间:2009-10-14 15:29:57

标签: php encoding utf-8 rss iso-8859-1

我正在尝试在其他网站上预览来自rss Feed的最新帖子。 Feed是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 个答案:

答案 0 :(得分:5)

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实体。

答案 1 :(得分:3)

我怀疑你的意思是Em Dash( - )。 ISO-8859-1不包含此字符,因此您不会很幸运将其转换为该编码。

您可以使用htmlentities(),但我建议将ISO-8859-1移至UTF-8进行发布。

答案 2 :(得分:3)

我想以下几点:

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

原因是您的 EM DASH 字符(U + 2014)由–表示。这正是您使用Windows-1252(0xE2 = â,0x80 = ,0x94 = 解释该字符(0xE28094)的UTF-8代码字时所获得的结果)。所以你首先需要修改你的编辑器编码。

输出中?的原因是ISO 8859-1不包含 EM DASH 字符。

答案 3 :(得分:1)

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

更好的是,只需将网站切换为UTF-8即可。它主要与Latin-1相符,更适合2009年的网站。