【问题标题】:String Encoding issue - PHP字符串编码问题 - PHP
【发布时间】:2019-11-17 16:51:13
【问题描述】:

我需要将 csv 文件中的列名存储到 mysql DB 中,在 PHP 中我曾经将字符串转换为 utf8_encode 格式。它不适用于某些字符串,

$name = "Téléphone"
echo utf8_encode($name); // it works

output : Téléphone

$name = "Etat œuvre"
echo utf8_encode($name); // it does not works

output : Etat Å?uvre

用于测试:

echo bin2hex($name);
output: 45746174209c75767265

【问题讨论】:

  • utf8_encode 是一个很没用的函数。它绝对不会像你想的那样做。
  • utf8_encode 从 ISO-8859-1 转换为 UTF-8。 ISO-8859-1 中不存在字符“–”,因此不清楚它最初是如何存在的。您的源代码是如何编码的?如有疑问,请联系echo bin2hex('Etat œuvre')
  • 首先回答我上面的问题。
  • @deceze 它打印 45746174209c75767265

标签: php encoding utf-8 character-encoding


【解决方案1】:

utf8_encode 不是此任务的“正确工具”。请改用mb_convert_encoding

例子:

function encodeUtf8(string $data): string
{
    if (!mb_check_encoding($data, 'UTF-8')) {
        return mb_convert_encoding($data, 'UTF-8');
    }

    return $data;
}

echo encodeUtf8('Téléphone'); // Téléphone
echo encodeUtf8('Etat œuvre'); // Etat œuvre

【讨论】:

  • 编码转换不应涉及任何if语句。如果您不知道要从 转换什么编码,那么最好不要转换。
  • @deceze 如果内容已经是 UTF-8 编码的,那么就不需要再编码两次了。
  • 如果您知道内容已经是 UTF-8 编码的,那么您一开始就不需要调用此函数。同样,您必须知道要转换的内容,而不是让代码决定。
  • @deceze 我不同意你的观点,因为在现实生活中这并不总是可能的。
  • 您编写的任何代码都可以完全控制您使用的编码。两个系统之间的任何接口都有元数据方法来注释正在使用的编码(例如 HTTP 标头、元标记、数据库连接编码设置等)。您绝对不知道的唯一一次是您何时接受任意纯文本文件。这里的策略必须是 1) 向用户询问编码和/或 2) 尝试检查一些常用的编码并让用户使用预览确认。依赖 mb_convert_encoding 的未定义 $from_encoding 参数是不明智的。
【解决方案2】:

45746174209c75767265

这里的“œ”是9c,它指向编码在Windows-1252中的字符串。 utf8_encodeISO-8859-1 转换为 UTF-8,因此您进行了错误的编码转换。正确的是:

mb_convert_encoding('Etat œuvre', 'UTF-8', 'CP1252')

【讨论】:

  • 以上代码在linux机器上正常工作(代码部署在linux机器上),在windows机器上不行。
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多