[英]Encoding conversion in PHP (ISO-8859-1, UTF-8, CP1250)
我想使用 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
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中ø
字母有一個代碼00F8
。 Windows-1250 (包括捷克語 aplhabet)具有正確的字母ř
代碼0159
但它們都以00F8
。 與前面有代碼00E7
的字母č
和è
相同。 我不太了解編碼,但似乎文件是在 Windows-1250 中編碼的,但解釋器認為編碼是 ISO-8859-1 並采用原位的字母/代碼。
但是兩種轉換(ISO-8859-1 => Windows-1250、ISO-8859-1 => UTF-8 或其他方式)都不起作用。
有誰知道如何解決這個問題? 謝謝!
8 位字符編碼的問題在於,它主要需要人類智能來解釋正確的代碼頁。
當您在file
上運行文件時,可以確定該文件主要由可打印字符組成,但由於它只查看字節,因此無法輕松區分 iso-8895-1 和 iso-8895- 2. 要file
, 0x80
與0x80
相同。
file
由於使用了0x80-0xFF
,因此只能判斷該文件是文本文件,並且可能是 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 )預先設置為所需的編碼。
如果您需要進一步的幫助,您將需要編輯您的問題以包含您正在使用的確切代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.