2

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

次のコマンドはどちらも、間違った文字を変換しませんでした: mb_convert_encoding($line, 'UTF-8', 'ISO8859-1') iconv('ISO-8859-1', 'UTF-8', $line) iconv('ISO8859-1', 'UTF-8', $line)

ISO-8859-1では、øレターに code があることに気付きました00F8Windows-1250 (チェコ語の aplhabet を含む) には正しい文字řとコード0159 がありますが、どちらも先頭に00F8. 文字čと同じでè、どちらも code が前に付いています00E7。私はエンコーディングを深く理解していませんが、ファイルは Windows-1250 でエンコードされているようですが、インタープリターはエンコーディングが ISO-8859-1 であると認識し、元の文字/コードの代わりに文字を取得します。

しかし、どちらの変換 (ISO-8859-1 => Windows-1250、ISO-8859-1 => UTF-8 またはその他の方法) も機能していません。

これを解決する方法を知っている人はいますか?ありがとう!

4

1 に答える 1

5

8 ビット文字エンコーディングの問題は、正しいコードページを解釈するためにほとんど人間の知性を必要とすることです。

ファイルを実行するfileと、ファイルの大部分が印刷可能な文字で構成されていることがわかりますが、バイトしか見ていないため、iso-8895-1 と iso-8895-2 の違いを簡単に見分けることはできません。 . にfile0x80と同じ0x80です。

file. は、ファイルがテキストであり、おそらく iso-8895-* または windows-* であることしかわかりません0x80-0xFF。つまり、ASCIIだけではありません。

(UTF-8 や UTF-16 などの Unicode エンコーディングは、ファイルの先頭に設定されたバイト シーケンスまたはバイト オーダー マークによって簡単に検出できます)

さまざまな言語の辞書を使用して、文字/バイト シーケンスに基づいてコードページを推定できるインテリジェントな文字コードページ検出器がいくつかあります。

必要な変換は単純にiso-8895-2 -> UTF-8.

あなたにとって重要なことは、元のエンコーディング (解釈) を知っていることと、それを検証するときに、表示しているエンコーディングを正確に知っていることです。

たとえば、PHP はデフォルトで HTTP 文字セットを に設定しますiso-8895-1。つまり、正しく に変換できる可能性は十分にありiso-8895-2ますが、ブラウザはiso-8895-1.

検証する最善の方法は、ファイルをディスクに保存し、VS Code などのテキスト エディターを使用して、ファイルを開く前に必要なエンコードを事前に設定することです。

さらにサポートが必要な場合は、質問を編集して、使用している正確なコードを含める必要があります。

于 2020-04-20T15:40:35.237 に答える