web-dev-qa-db-ja.com

誰かがこのエンコーディング関連の動作を説明できますか?

かなり読んだにもかかわらず、エンコーディングは私の強みではありません。

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

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

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

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

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

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

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

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

プログラムで(Groovyを使用して、groovy.xml.XMLParser)このファイルを解析し、一見有効なgroovy.util.Node構造を生成することができます。変更されているかどうかに関係なく、この内部Node構造を保存しようとする段階にはまだ到達していません。

誰かがこのファイルの何が問題になっているのか(もしあれば)、そしてそれを安全に編集する方法を教えてもらえますか?

1
mike rodent

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キャラクターは、ソフトウェアを混乱させます...

iconvを使用して、より妥当なUTF-8に変換できます。

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

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

1
xenoid