PHP中的编码转换(ISO-8859-1、UTF-8、CP1250)

PHP中的编码转换(ISO-8859-1、UTF-8、CP1250),php,utf-8,iso-8859-1,cp1250,Php,Utf 8,Iso 8859 1,Cp1250,我想处理CSV文件中的数据,但我意识到字母显示不正确。我尝试了无数种方法来转换编码,但都不起作用。在MacOS上工作,PHP7.4.4 在handle变量上执行fgets()或fgetcsv()后,我将得到这个(示例中为2行/行) 它或多或少是正确的捷克语,但字母č被è取代,ř被ø取代,两者都不是捷克字母表的一部分。我有信心,档案中会有更多放错地方的信件 执行file-I路径/to/fileI接收file:text/plain;charset=iso-8859-1,这很可悲,因为就目前而言,这个

我想处理CSV文件中的数据,但我意识到字母显示不正确。我尝试了无数种方法来转换编码,但都不起作用。在MacOS上工作,PHP7.4.4

在handle变量上执行
fgets()
fgetcsv()
后,我将得到这个(示例中为2行/行)

它或多或少是正确的捷克语,但字母
č
è
取代,
ř
ø
取代,两者都不是捷克字母表的一部分。我有信心,档案中会有更多放错地方的信件

执行
file-I路径/to/file
I接收
file:text/plain;charset=iso-8859-1
,这很可悲,因为就目前而言,这个charset没有捷克字母表

以下两个命令均未转换错位的字母:
mb\u convert\u编码($line,'UTF-8','ISO8859-1')
iconv('ISO-8859-1','UTF-8',$line)
iconv('ISO8859-1','UTF-8',$line)

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

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


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

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

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

由于使用了
0x80-0xFF
,因此
file
只能判断文件是文本,可能是iso-8895-*或windows-*。也就是说,不仅仅是ASCII码

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

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

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

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

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

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

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

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