iconvがBOMでUTF-16を生成


11

この質問に触発され、iconvコマンドを使用して、BOMと指定されたエンディアンでUTF-16出力を生成できますか?

このiconvコマンドは、テキストをあるエンコーディングから別のエンコーディングに変換します。

例えば:

echo hello | iconv -f ascii -t utf-16

のUTF-16表現を生成します"hello\n"

UTF-16ファイルは、常にではありませんが、Unicode文字の2バイトエンコーディングであるバイトオーダーマーク(BOM)で始まることがよくありますU+FEFF。最初の2バイトがFE FFまたはであるかどうかを確認することにより、BOMを含むUTF-16ファイルのエンディアンを判別できますFF FE

このiconvコマンドには、UTF-16出力を生成するためのいくつかのオプションがあります。

$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//

このコマンド:

echo hello | iconv -f ascii -t utf-16be

BOMなしでビッグエンディアンUTF-16 生成します。エンディアンを指定した場合、出力でそれを示す必要がないと想定しているようです。同様に、utf-16leBOMなしのリトルエンディアンUTF-16を生成します。

この:

echo hello | iconv -f ascii -t utf-16

(私のx86 Ubuntuシステムで)BOMを使用てリトルエンディアンUTF-16 を生成します-しかし、リトルエンディアンシステムであっても、BOMを使用してビッグエンディアンUTF-16を生成する同様のコマンドのレポートを見ました。

いつでも手動でBOMを使用しutf-16beたりutf-16le、先頭に追加したりできますが、iconvコマンドを使用するだけの解決策を探しています。

エンディアンが生成するものを知っている場合の別の回避策は次のとおり-t utf-16です。

echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null

私は思います好きな使用にはのようなものです:

iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM

それiconvはサポートしていません。

編集:

x86 Mac OSXシステムにアクセスできる誰かが、次のコマンドの(コピーアンドペーストされた)出力を示すコメントを投稿できますか?

echo hello | iconv -f ascii -t utf-16 | od -x

1
BOMはデータの移植性を低下させますが、この方法で追加
RedGrittyBrick 2012年

@RedGrittyBrick:(特にUtF-16の場合)移植性をどのように低下​​させますか?私はBOMを簡単に生成できることを知っています。私はそれを使用するだけでそれを行う方法を探していますiconv-そして、なぜ-t utf-16エンディアンを無制限のままにしたように思われるのかと思っています。
キーストンプソン

明示的に指定しない場合、iconvは現在のプラットフォームのバイト順を想定していると思います。Windows以外の一部のプラットフォームでは、一部のテキスト処理ツールはBOMを想定していないため、間違った処理を行います。たとえば、テキストファイルを連結する場合や、ファイルベースのテンプレートを使用してコンテンツを作成する場合などです。「IANA登録文字セットUTF-16BEおよびUTF-16LEの場合、これらの文字セットの名前がす​​でにバイトオーダーを決定しているため、バイトオーダーマークを使用しないでください」
RedGrittyBrick

この質問iconv -f UTF-8 -t UTF-16、リトルエンディアンシステム(MacOS)で実行し、BOMでビッグエンディアンUTF-16を生成することを示しています。
Keith Thompson

回答:


9

いいえ、バイト順序を指定した場合iconv、BOMは挿入されません。

これはUnicodeコンソーシアムからのものです

Q:BOMの扱い方は?

A:ここに、従うべきいくつかのガイドラインがあります。

  1. 特定のプロトコル(.txtファイルに関するMicrosoftの規則など)では、ファイルなどの特定のUnicodeデータストリームでBOMを使用する必要がある場合があります。このようなプロトコルに準拠する必要がある場合は、BOMを使用します。
  2. タグ付けされていないテキストの場合、一部のプロトコルはオプションのBOMを許可します。それらのケースでは、
    • テキストデータストリームがプレーンテキストであることがわかっているが、エンコードが不明である場合、BOMを署名として使用できます。BOMがない場合、エンコーディングは何でもかまいません。
    • テキストデータストリームがプレーンなUnicodeテキストであることがわかっている(ただし、どのエンディアンではない)場合、BOMを署名として使用できます。BOMがない場合、テキストはビッグエンディアンとして解釈されます。
  3. 一部のバイト指向プロトコルでは、ファイルの先頭にASCII文字が必要です。これらのプロトコルでUTF-8を使用する場合、エンコーディングフォームの署名としてBOMを使用しないでください。
  4. データストリームの正確なタイプがわかっている場合(UnicodeビッグエンディアンやUnicodeリトルエンディアンなど)、BOMは使用しないでください。特に、 データストリームがUTF-16BE、UTF-16LE、 UTF-32BE、またはUTF-32LE として宣言されている場合は常に、BOMを使用してなりません

(私の強調)

iconvこれらのガイドラインの最後に忠実であるように努めていると思います。


更新。

余談

私の考えでは:

  1. BOMを指定するオプションは、iconvの便利な追加機能です。

  2. BOMなしのUTF-16LEファイルがあり、時には、追加の手間はあるものの、Windowsで使用可能。たとえば、メモ帳の[ファイルを開く]ダイアログでは、Microsoftの "UTF-16LE"の名前である "Unicode"を選択でき、BOMがないファイルでも(当然のことながら)機能するようです。

  3. エクスプローラーでファイル名をダブルクリックするなどの通常の方法で、Windowsのメモ帳(XP)でUTF-16LEテストファイル(BOMなし)またはUTF-8テストファイル(BOMなし)を開くことができます。それは私には使いやすいようです。私はWindowsが時々エンコーディングを誤って推測することを知っています-この場合、ファイルを開くときにエンコーディングをメモ帳に通知する必要があります。この不便さは、Windowsでの使用を目的としたテキストファイルにはBOMを含めることが望ましいことを意味します。

  4. 特定のアプリケーションがBOMを含むUTF-16LEファイル以外で機能しない場合、その特定のアプリケーションではBOMを含まないUTF-16LEファイルは使用できないことに同意します。

  5. 私はと思われる場合は、あなたがUTF-8(BOMなし)ですべての作業を行うことができますが、それは長期的に最適なソリューションです。

ただし、「iconvコマンドを使用して、BOMと指定されたエンディアンでUTF-16出力を生成することはできますか」という質問に対する回答は、現在「いいえ」です。


1
そして、最初のガイドラインA.1はどうですか?x86 Windowsシステムで使用できるUnicodeテキストファイルを生成する場合は、BOMを含むリトルエンディアンUTF16ファイルにする必要があります。
Keith Thompson

@KeithThompson:システムはUTF16LEとUTF16BEの両方を受け入れる必要があります。少なくともWindowsのメモ帳では.txt、ファイルにBOMがある限り、両方を受け入れます。
user1686 2012年

@KeithThompson:ガイドライン1を優先することに同意しますが、iconvはBOMを指定する方法を提供しません。元の質問に対する答えは単に「いいえ」です。
RedGrittyBrick 2012年

私が望んでいた答えではなく、答え、そして徹底した答え!
Keith Thompson

2
この答えは私を助けました-私がなぜ失敗したのかを学ぶのを助けました。レジストリからエクスポート/インポートする標準のWindowsプログラムは、C:\Windows\System32\reg.exeUTF-16 LE WITH BOMをエクスポートし、UTF-16 LE WITH BOM のみを読み取ります-BOM なしで UTF-16 LE 読み取らず、 BOM 付き UTF-16 BE 読み取りません -言い換えれば、それは読むときにBOMを要求しますが、正しいものである方が良いのです。(幸いにも、UTF-8を読み取ります。)
davidbak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.