PHP 中的编码转换(ISO-8859-1、UTF-8、CP1250)
Encoding conversion in PHP (ISO-8859-1, UTF-8, CP1250)
我想使用 CSV 文件中的数据,但我发现字母显示不正确。我尝试了数百万种方法来转换编码,但没有任何效果。在 MacOS 上工作,PHP 7.4.4。
在 handle 变量上执行 fgets()
或 fgetcsv()
后,我会得到这个(例如 2 rows/lines)。
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 the ø
letter has a code 00F8
. Windows-1250(包括捷克语 aplhabet)中有正确的字母 ř
,代码为 0159
,但它们前面都有 00F8
。与字母 č
和 è
相同,它们都以代码 00E7
开头。我不太了解编码,但似乎文件编码为 Windows-1250,但解释器认为编码为 ISO-8859-1 并采用原始 place/code 中的字母。
但转换(ISO-8859-1 => Windows-1250、ISO-8859-1 => UTF-8 或其他方式)均无效。
有人知道如何解决这个问题吗?谢谢!
8 位字符编码的问题在于它主要需要人类智能来解释正确的代码页。
当你 运行 file
在一个文件上时,它可以计算出该文件主要由可打印字符组成,但由于它只查看字节,所以不能轻易分辨iso-8895-1 和 iso-8895-2 的区别。对于file
,0x80
等同于0x80
。
由于使用了 0x80-0xFF
,file
只能判断该文件是文本文件,可能是 iso-8895-* 或 windows-*。 IE。不只是 ASCII。
(Unicode 编码,如 UTF-8 和 UTF-16 更容易通过其字节序列或文件顶部设置的字节顺序标记来检测)
有一些智能字符代码页检测器,借助不同语言的字典,可以根据 character/byte 序列估计代码页。
您可能需要的转换很简单 iso-8895-2 -> UTF-8
。
对您来说重要的是您知道原始编码(解释),然后在验证它时,您确切地知道您正在查看它的编码。
例如,PHP 将默认将 HTTP 字符集设置为 iso-8895-1
。这意味着您很可能会正确转换为 iso-8895-2
,但您的浏览器随后会将 "interpret" 转换为 iso-8895-1
.
最好的验证方法是将文件保存到磁盘,然后使用 VS Code 等文本编辑器预先设置所需的编码,然后再打开文件。
如果您需要进一步的帮助,您将需要编辑您的问题以包含您正在使用的确切代码。
我想使用 CSV 文件中的数据,但我发现字母显示不正确。我尝试了数百万种方法来转换编码,但没有任何效果。在 MacOS 上工作,PHP 7.4.4。
在 handle 变量上执行 fgets()
或 fgetcsv()
后,我会得到这个(例如 2 rows/lines)。
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 the ø
letter has a code 00F8
. Windows-1250(包括捷克语 aplhabet)中有正确的字母 ř
,代码为 0159
,但它们前面都有 00F8
。与字母 č
和 è
相同,它们都以代码 00E7
开头。我不太了解编码,但似乎文件编码为 Windows-1250,但解释器认为编码为 ISO-8859-1 并采用原始 place/code 中的字母。
但转换(ISO-8859-1 => Windows-1250、ISO-8859-1 => UTF-8 或其他方式)均无效。
有人知道如何解决这个问题吗?谢谢!
8 位字符编码的问题在于它主要需要人类智能来解释正确的代码页。
当你 运行 file
在一个文件上时,它可以计算出该文件主要由可打印字符组成,但由于它只查看字节,所以不能轻易分辨iso-8895-1 和 iso-8895-2 的区别。对于file
,0x80
等同于0x80
。
0x80-0xFF
,file
只能判断该文件是文本文件,可能是 iso-8895-* 或 windows-*。 IE。不只是 ASCII。
(Unicode 编码,如 UTF-8 和 UTF-16 更容易通过其字节序列或文件顶部设置的字节顺序标记来检测)
有一些智能字符代码页检测器,借助不同语言的字典,可以根据 character/byte 序列估计代码页。
您可能需要的转换很简单 iso-8895-2 -> UTF-8
。
对您来说重要的是您知道原始编码(解释),然后在验证它时,您确切地知道您正在查看它的编码。
例如,PHP 将默认将 HTTP 字符集设置为 iso-8895-1
。这意味着您很可能会正确转换为 iso-8895-2
,但您的浏览器随后会将 "interpret" 转换为 iso-8895-1
.
最好的验证方法是将文件保存到磁盘,然后使用 VS Code 等文本编辑器预先设置所需的编码,然后再打开文件。
如果您需要进一步的帮助,您将需要编辑您的问题以包含您正在使用的确切代码。