【问题标题】:mb_convert_encoding issuesmb_convert_encoding 问题
【发布时间】:2012-08-22 11:48:45
【问题描述】:

我对 PHP 函数 mb_detect_encoding 有一些问题。 我无法将其转换为 ISO-8859-1。有什么帮助吗?

代码:

$str = "åäö";
$encoding = mb_detect_encoding($str);
echo $encoding;
            
$encoding = mb_detect_encoding(mb_convert_encoding($str, "ISO-8859-1"));
echo $encoding;

输出:

UTF-8

UTF-8

更新,解决方案:

我将 mb_detect_order 更新为 array('UTF-8', 'ISO-8859-1') 并且它起作用了。

【问题讨论】:

  • 你的mb_detect_order()是什么?
  • 好了。我在开始时将 mb_detect_order 更新为 UTF-8 并且它有效。谢谢!
  • 如果您已经解决了您的问题,请将其作为答案发布并尽可能接受。

标签: php encoding utf-8


【解决方案1】:

你实际上并没有转换你的字符串。相反,对 mb_convert_encoding 的调用并不假定原始字符串是 UTF-8 格式的。调用之前的字符串是一个字节序列,可能已经是 ISO-8859-1(并且会以不同的方式表示项目)。您可以看到这种情况,而不是调用mb_detect_encoding,而是在字符串上使用bin2hex,并在转换调用后查看字节序列。你会看到字节序列没有改变。

要使转换工作,您需要告诉它(在这种情况下)原始编码。使用:

mb_convert_encoding($str, 'ISO-8859-1','utf-8');

如果您在此之后检查字节序列,您会看到发生了转换。

【讨论】:

  • ISO-8859-1 是否适用于无编码“字符串”(即随机无效字节序列)?
【解决方案2】:

我将 mb_detect_order 更新为 array('UTF-8', 'ISO-8859-1') 并且它起作用了

【讨论】:

  • 你在欺骗自己相信转换已经成功。由于 c3a5c3a4c3b6 是 UTF-8 和 ISO-8859-1 中的有效字节字符串(在两种情况下代表不同的事物),您可以让 mb_detect_order 将其报告为任一编码。
  • @borrible 如果他的mb_internal_encoding 已经设置为UTF-8 怎么办?
  • @Passerby - 这与我们所看到的不一致。如果该字符串实际上已转换为 ISO-8859-1,它将成为字节序列 e5e4f6。现在这不是有效的 UTF-8,因此 mb_convert_encoding 不会报告 UTF-8。但是,如果序列保留为 c3a5c3a4c3b6(有效的 UTF-8 或 ISO-8859-1),我们将得到所描述的情况。
  • @borrible 即使字符串不是有效的 UTF-8,mb_detect_encoding 也可能始终返回“UTF-8”。我的默认mb_detect_orderASCII, UTF-8。通过仅指定mb_internal_encoding("UTF-8"),并运行OP 的代码加上bin2hex 进行调试,我可以看到字节序列已更改,但mb_detect_encoding 将始终返回“UTF-8”。 PHP 5.3.10.
  • @Passerby - 在这种情况下,将 mb_internal_encoding 设置为 UTF-8 的净效果等同于将 utf-8 设置为 mb_convert_encoding 的第三个参数。我认为,鉴于 OP 没有谈论使用其他 mb_ 功能,他所看到的情况不太可能意味着您描述的情况已经发生。 IE。我建议这更像是解决错误转换的潜在解决方案(尽管不是我建议的),而不是他的问题的原因。
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 2012-01-06
相关资源
最近更新 更多