簡體   English   中英

PHP(ISO-8859-1、UTF-8、CP1250)中的編碼轉換

[英]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. file0x800x80相同。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM