質問: CSVファイルのデータを処理したいのですが、文字が正しく表示されないことに気づきました。エンコーディングを変換するために何百万もの方法を試しましたが、何も機能しません。 MacOS、PHP7.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:00Copy code ``` 多かれ少なかれ正しいチェコ語ですが、文字`č``è`置き換えられ、`ř``ø`に置き換えられ、どちらもチェコ語の一部ではありません。アルファベット。私は自信を持っています、ファイルに間違った文字がもっとあるでしょう。 `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では、`ø`文字のコードが`00F8`ことに気づきました。 Windows-1250 (czech aplhabetを含む)には、正しい文字`ř`とコード`0159`**がありますが、どちらの前にも`00F8`**が付いています。`č`および`è`と同じで、どちらも前にコード`00E7`が付いています。エンコーディングについてはあまり深く理解していませんが、ファイルはWindows-1250でエンコードされているようですが、インタプリタはエンコーディングがISO-8859-1であると考え、元の文字を使用します。 ただし、どちらの変換(ISO-8859-1 => Windows-1250、ISO-8859-1 => UTF-8、またはその他の方法)も機能していません。 誰かがこれを解決する方法を知っていますか?ありがとう!
回答: ### 答え : #### 解決: 8ビット文字エンコーディングの問題は、正しいコードページを解釈するために人間の知性がほとんど必要なことです。 `file`でfileを実行すると、fileはほとんどが印刷可能な文字で構成されていることがわかりますが、バイトのみを参照しているため、それはできません。 iso-8895-1とiso-8895-2の違いを簡単に見分けることができます。`file``0x80`同じである`0x80` 。 `file``0x80-0xFF`使用しているため、fileがテキストであり、おそらくiso-8895- *またはwindows- *であることを認識できます。つまり、ASCIIだけではありません。 (UTF-8やUTF-16などのUnicodeエンコーディングは、fileの上部に設定されているバイトシーケンスまたはバイト順マークによって簡単に検出できます) さまざまな言語の辞書を使用して、文字/バイトシーケンスに基づいてコードページを推定できるインテリジェントな文字コードページ検出器がいくつかあります。 必要になる可能性のある変換は、単に`iso-8895-2 -> UTF-8`です。 あなたにとって重要なことは、元のエンコーディング(解釈)を知っていること、そしてそれを検証するときに、それを表示しているエンコーディングを正確に知っていることです。 たとえば、PHPはデフォルトでHTTP文字セットを`iso-8895-1`設定します。`iso-8895-2`に正しく変換することは可能です`iso-8895-1`として「解釈」します。 検証する最良の方法は、fileをディスクに保存し、fileを開く前に、**事前に必要なエンコーディングに設定されたVSCodeなどのテキストエディタを使用することです。** さらにヘルプが必要な場合は、使用している正確なコードを含めるように質問を編集する必要があります。