このエンコード関連の動作を説明できる人はいますか?

このエンコード関連の動作を説明できる人はいますか?

かなり読んではいるものの、エンコードは私の得意分野ではありません。

編集したいファイルがあり、その拡張子は .tdl ですが、特に意味はありません。

これは XML ファイルです。最初の行は次のようになります。

<?xml version="1.0" encoding="utf-16"?>

このファイルを gedit で開こうとすると、黄色い背景に次のような大きなメッセージが表示されます。

「ファイルを開くときに問題が発生しました... 開いたファイルには無効な文字が含まれています。このファイルの編集を続けると、ドキュメントが破損する可能性があります。別の文字エンコードを選択して再試行することもできます。」

この下の文字エンコーディング ドロップダウン ボックスには、「現在のロケール (UTF-8)」と表示されます。

これを「Unicode (UTF-16)」に設定して「再試行」をクリックしようとしました。厄介なメッセージが再び表示され、ドロップダウンが「現在のロケール (UTF-8)」に戻されました。

また、「ファイル」->「開く」->「文字エンコード」で「自動検出」から「Unicode (UTF-16)」に変更してファイルを開こうとしました。しかし、ドロップダウンが「現在のロケール (UTF-8)」に設定されていても、再び厄介なメッセージが表示されます。

プログラム的に (Groovy を使用してgroovy.xml.XMLParser) このファイルを解析し、一見有効な構造を生成することができますgroovy.util.Node。変更の有無にかかわらず、この内部ノード構造を保存する段階にはまだ達していません。

このファイルの何が問題なのか(もし問題があれば)、また安全に編集するにはどうしたらよいのか、誰か教えてもらえますか?

答え1

UTF-16 では、文字は 2 バイトで表され、ASCII 文字の場合、上位バイトは 0x00 です。

たとえば、UTF-16 の「Something」は次のようになります。

00000000  ff fe 53 00 6f 00 6d 00  65 00 74 00 68 00 69 00  |..S.o.m.e.t.h.i.|
00000010  6e 00 67 00 0a 00                                 |n.g...|

(OxFFFE先頭はバイトオーダーマークです。0xFEFF が表示されている場合は、バイトをスワップする必要があることがわかります...)。

いたるところに NUL 文字があると、ソフトウェアが混乱します...

次のようにして、より適切な UTF-8 に変換できますiconv

iconv -f UTF-16 -t UTF-8 <utf16file >utf8file

ファイルヘッダーのエンコーディングを変更することを忘れないでください

答え2

ファイルが UTF-16 (Windows の一般的なエンコーディング) の場合、Linux (UTF-8 ネイティブ、過激派...) では問題が発生します。少なくとも GNU emacs は UTF-16 をサポートしていると述べており、実際に使用したことはありません。

recode(1) を実行して UTF-8 に変換し (そして一致するようにヘッダーなどを修正し) てみることもできますが、そうすると UTF-16 を想定しているツールがひどく壊れてしまう可能性があります。

アップデート:ちょっと考えてみたんだけど、UTF-8に再コード化して、ゆっくり改変して、スピンドルして、UTF-16に再コード化する。そうすれば、途中で使い慣れたツールが使える。でもする発表された UTF-16 エンコーディングを修正します。ツールが混乱するかどうかは誰にもわかりません。あるいは、XML マングリング ツールがこれを考慮するかもしれません...

関連情報