かなり読んではいるものの、エンコードは私の得意分野ではありません。
編集したいファイルがあり、その拡張子は .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 マングリング ツールがこれを考慮するかもしれません...