Unicode、Unicode Big Endian、またはUTF-8ですか?違いはなんですか?どちらの形式が良いですか?


19

メモ帳で英語以外のテキストを含むテキストファイルを保存しようとすると、UnicodeUnicode Big EndianUTF-8から選択するオプションが表示されます。これらの形式の違いは何ですか?

私はないと仮定していない(古いOSのバージョンやアプリケーションとの)任意の下位互換性を必要と私はないではない、これらのフォーマットで優れているファイルサイズは、気に?

(テキストは、他の言語に加えて、中国語や日本語などの言語で作成できると仮定します。)

注:以下の回答とコメントから、メモ帳の用語では、UnicodeはUTF-16(リトルエンディアン)、UnicodeビッグエンディアンはUTF-16(ビッグエンディアン)、UTF-8はUTF-8であるようです。


回答:


19

ダンノ 鋸とハンマーのどちらが良いですか?:-)

UnicodeはUTFではありません

ただし、この記事には、手元の主題に少し関連するものが少しあります。

  • UTF-8は、ASCIIセット(可変長表現:各文字は1〜4バイトで表され、ASCII文字はすべて1バイトに収まる)の文字を表現するためにバイトサイズを最小化することに焦点を当てています。ジョエルが言うように:

彼らはアメリカ人で、U + 00FFを超えるコードポイントをほとんど使用しない英語のテキストを見ていたので、「ゼロをすべて見てください!」また、彼らはカリフォルニアのリベラルなヒッピーであり、保護したかった(冷笑した)。彼らがテキサス人であれば、バイト数の2倍のガズリングを気にしなかったでしょう。しかし、これらのカリフォルニアの弱虫は、文字列に必要なストレージ量を倍にするという考えに耐えることができませんでした

  • UTF-32は、すべての文字に4バイトを使用して、網羅性と固定長表現に焦点を当てています。Unicodeコードポイントを4バイトに直接マッピングする最も簡単な変換です。明らかに、あまりサイズ効率が良くありません。

  • UTF-16はほとんどの場合2バイトを使用する妥協案ですが、特定の文字(Basic Multilingual Plane(BMP)に含まれない文字)を表すために文字ごとに2 * 2バイトに拡張します。

また、すべてのソフトウェア開発者が絶対的かつ積極的にUnicodeおよび文字セットについて知っておく必要のある絶対最小値(言い訳なし!)も参照してください


4
問題は、Unicodeが「エンコード」であるという事実に由来しますが、バイト単位の意味ではありません。UTF-8 / 16/32はすべてUnicodeエンコーディングですが、Unicode自体はシンボルから数字へのマッピングです。この混乱を避けるために、彼らはもっとユニークな用語を使用できたかもしれません。
jerryjvl 09

4
とはいえ、質問のOPには、アプリケーションが「Unicode」と言う「UTF-16」を意味する可能性があります。
jerryjvl

3
UTF-8の目標がASCIIとの後方互換性ではなく「保存」であるかどうかはわかりません。
シャイニー氏と新安宇

@Johannes:Unicode Consortiumは、UTF-16で表現できないため、U + 10FFFFを超えるコードポイントを割り当てないことを決定しました。これには、UTF-8を4バイトに制限する効果がありました。
user46971

1
「UnicodeはUTFではありません」-多くの場合、WTFです;)
mlvljr

4

ヨーロッパ言語の場合、UTF-8は小さくなります。東洋言語の場合、違いはそれほど明確ではありません。

両方とも可能なすべてのUnicode文字を処理するため、互換性に違いはありません。


3

あなたが考えているよりも多くのUnicode文字エンコーディングがあります。

  • UTF 8

    UTF-8エンコードは可変幅で、1〜4バイトの範囲で、各バイトの上位ビットは制御ビットとして予約されています。最初のバイトの先頭ビットは、その文字に使用される合計バイト数を示します。文字のコードポイントのスカラー値は、非制御ビットの連結です。この表でxは、Unicode値の最下位8ビットをy表し、次に上位8ビットをz表し、それより上位のビットを表します。

    Unicode              Byte1     Byte2     Byte3     Byte4
    U+0000-U+007F       0xxxxxxx            
    U+0080-U+07FF       110yyyxx  10xxxxxx          
    U+0800-U+FFFF       1110yyyy  10yyyyxx  10xxxxxx    
    U+10000-U+10FFFF    11110zzz  10zzyyyy  10yyyyxx  10xxxxxx
    
  • UCS-16
  • UCS-16BE
  • UCS-16LE

  • UTF-16
  • UTF-16BE
  • UTF-16LE

  • UTF-32
  • UTF-32-BE

1
リストされているよりも多くのUnicode文字エンコードがあります。たとえば、UTF-1UTF-7UTF-EBCDICGB-18030MIMEUTF-9、およびUTF-18 ...また、バイナリエンコード方式を使用してUnicodeデータをエンコードすることもできます。続きを読むUnicodeエンコーディングの比較
-phuclv

1

「Unicode」は「UTF-16」の別の用語で、Unicode文字セットを文字ごとに16ビットにエンコードすることです。UTF-8は、文字ごとに8ビットにエンコードします。

どちらの場合も、オーバーフローは別の16ビットまたは8ビットに割り当てられます。


どちらが良いですか?
R.マルティーニ・フェルナンデス

状況次第です。
ジョンサンダース

この特定の質問については、「Unicode」は「UTF-16」の別の用語として実際に虐待されているようですが、一般的にはそうではありません-ジェイソンの答えを参照してください。
アルジャン

1
つまり、「文字ごと」ではなく「コード単位ごと」です。UTF-8とUTF-16の両方で、複数のコード単位を使用して文字を表すことができます。「Unicode」と「UTF-16」は、Microsoftの用語を除いて同じものではありません。
user46971

1

テキストファイルのような小さなファイルの唯一の本当の利点は、結果のファイルサイズです。通常、UTF-8は小さなファイルを生成します。しかし、この違いは中国語/日本語のテキストではそれほど顕著ではありません。


ネットワーク帯域幅とメモリ使用量にも違いがあることに注意してください。
ジェイソンベイカー

1
「UTF-8は一般的に小さなファイルを生成します」:一般的ではありません。UTF-8は、ASCIIファイル用の小さなファイルを生成します。ファイルがU + 0800を超えるUnicodeコードポイントのみで構成されている場合、UTF-16よりもUTF-8の大きくなります。
sleske

0

つまり、Unicodeは文字セットであり、Unicode Big Endianとutf-8は2つのエンコーディングであり、コンピューターに01として文字を格納するために使用されます。


そして違いは...?
デビッドリチャービー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.