【问题标题】:PHP encoding from ISO-8859-1 to UTF-8从 ISO-8859-1 到 UTF-8 的 PHP 编码
【发布时间】:2011-09-23 06:34:35
【问题描述】:
<?php
mb_internal_encoding('UTF-8');
mb_language('uni');
$a=file_get_contents("http://www.ciao.de/Erfahrungsberichte/8x4_Wild_Flower_Deo_Spray__8937431");
preg_match('/dass auf dem Versch(.*)ziehen mich/Us',$a,$b);
$b=$b[1];
echo $b."\n";
echo utf8_encode($b)."\n";
echo mb_convert_encoding($b,'UTF-8','iso-8859-1')."\n";

结果

lussdeckel riesengro▒ und un▒bersehbar glitzernd ein ▒New▒ prangt. Neue Produkte
lussdeckel riesengroß und unübersehbar glitzernd ein �New� prangt. Neue Produkte
lussdeckel riesengroß und unübersehbar glitzernd ein �New� prangt. Neue Produkte

HTTP 源代码在元标记中建议使用“iso-8859-1”。德语变音符号很好,但为什么“新”周围的引号没有正确转换?在 PHP manual 中有一个函数 fix_latin。使用此功能时,引号也可以正确转换!?

PS:欧洲货币符号 € (EUR) 也是如此 - 它也转换错误(除了 fix_latin 函数),但为什么?

【问题讨论】:

  • 尝试将 HTTP 元中的字符编码设置为 utf8,看看是否可行。
  • 嗯,我没有 ciao.de,所以我无法影响它。我想抓取一些结果。

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


【解决方案1】:

欧元符号不在 ISO-8859-1 中。 (为此目的创建了 ISO-8859-15。)

据我所知,mb_convert_encoding() 不会音译字符。考虑改用iconv()。和/或确保根据需要设置 content-type 标头。

在下一个 PHP 版本中,还会有 Transliterator class,它封装了 ICU。

【讨论】:

  • mb_convert_encoding($b,'UTF-8','ISO-8859-15') 不起作用,iconv('ISO-8859-15','UTF-8',$b) 也不起作用。我想,在 ISO-8859-1* 编码和mb_convert_encoding() 其他情况下,我将使用 fix_latin 函数。
  • 嗯,你要做什么并不完全清楚。另外,请记住,如果您的字符串已经是ISO-8859-15(如果它是用户输入,这是可能的),告诉PHP 将其读取为UTF-8 并将其转换为ISO-8859-15 可能确实会导致垃圾。 :-)
  • 这很清楚。我没有告诉 PHP 将其读取为 UTF-8。为此,我正在解析 HTTP 响应标头和 HTTP 内容并寻找 Content-Type 声明。当我找到这样的标签时,我会调用 mb_convert_encoding 将此编码内容转换为 UTF-8。
  • 这个扩展(INTL,因此是音译)从 PHP 版本 5.3.0 开始与 PHP 捆绑在一起。或者,此扩展的 PECL 版本可用于所有高于 5.2.0 的 PHP 版本(推荐 5.2.4+)。
  • @user672452:只有在原始文件/标题中正确命名了编码时才有效。
猜你喜欢
  • 1970-01-01
  • 2016-10-04
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 2016-07-18
  • 2017-01-10
相关资源
最近更新 更多