【问题标题】:Encoding conversion in PHP (ISO-8859-1, UTF-8, CP1250)PHP 中的编码转换(ISO-8859-1、UTF-8、CP1250)
【发布时间】:2020-04-20 15:15:34
【问题描述】:

我想处理 CSV 文件中的数据,但我发现字母显示不正确。我尝试了数百万种方法来转换编码,但没有任何效果。在 MacOS、PHP 7.4.4 上工作。

在句柄变量上执行fgets()fgetcsv() 后,我会得到这个(例如2 行/行)。

Kód ADM;Kód obce;Název obce;Kód MOMC;Název MOMC;Kód MOP;Název MOP;Kód èásti obce;Název èásti obce;Kód ulice;Název ulice;Typ SO;Èíslo domovní;Èíslo orientaèní;Znak èísla orientaèního;PSÈ;Souøadnice Y;Souøadnice X;Platí Od

1234;1234;HorniDolni;;;;;1234;HorniDolni;;;è.p.;2;;;748790401;4799.98;15893971.21;2013-12-01T00:00:00

它或多或少是正确的捷克语,但字母 čè 取代,řø 取代,它们都不是捷克字母表的一部分。我有信心,文件中会出现更多错位的字母。

执行file -I path/to/file 我收到file: text/plain; charset=iso-8859-1,这很可悲,因为就wiki 而言,这个字符集不包含捷克语字母。

以下命令都没有转换错位的字母: mb_convert_encoding($line, 'UTF-8', 'ISO8859-1') iconv('ISO-8859-1', 'UTF-8', $line) iconv('ISO8859-1', 'UTF-8', $line)

我注意到ISO-8859-1 中的ø 字母有一个代码00F8Windows-1250(包括捷克语 aplhabet)有正确的字母 ř 和代码 0159 但它们前面都有 00F8。与字母čè 相同,它们都以代码00E7 开头。我不太了解编码,但似乎文件是在 Windows-1250 中编码的,但解释器认为编码是 ISO-8859-1 并采用原位的字母/代码。

但两种转换(ISO-8859-1 => Windows-1250、ISO-8859-1 => UTF-8 或其他方式)都不起作用。

有人知道如何解决这个问题吗?谢谢!

【问题讨论】:

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


    【解决方案1】:

    8 位字符编码的问题在于,它主要需要人类智能来解释正确的代码页。

    当您在文件上运行file 时,它可以确定该文件主要由可打印字符组成,但由于它只查看字节,因此无法轻易区分 iso-8895-1和iso-8895-2。对于file0x800x80 相同。

    file 只能判断文件是文本文件,并且可能是 iso-8895-* 或 windows-*,因为使用了 0x80-0xFF。 IE。不只是 ASCII。

    (Unicode 编码,如 UTF-8 和 UTF-16 更容易通过它们的字节序列或文件顶部设置的字节顺序标记来检测)

    有一些智能字符代码页检测器,借助不同语言的字典,可以根据字符/字节序列估计代码页。

    您需要的可能转换只是iso-8895-2 -> UTF-8

    对您来说重要的是您知道原始编码(解释),然后在验证它时,您确切地知道您正在查看它的编码。

    例如,默认情况下 PHP 会将 HTTP 字符集设置为 iso-8895-1。这意味着您很有可能正确转换为iso-8895-2,但您的浏览器随后将“解释”为iso-8895-1

    最好的验证方法是将文件保存到磁盘,然后在打开文件之前使用 VS Code 等文本编辑器预先设置所需的编码

    如果您需要进一步的帮助,您需要编辑您的问题以包含您正在使用的确切代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-18
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 2016-10-04
      • 2011-08-01
      相关资源
      最近更新 更多