web-dev-qa-db-ja.com

1つのUnicode文字は何バイトかかりますか?

エンコーディングについて少し混乱しています。私が知っている限りでは、古いASCII文字は1文字あたり1バイトでした。 Unicode文字には何バイト必要ですか?

私は1つのUnicode文字があらゆる言語からのあらゆる可能な文字を含むことができると思います - 私は正しいですか?それで、それは1文字あたり何バイト必要でしょうか?

そして、UTF-7、UTF-6、UTF-16などはどういう意味ですか?それらは異なるバージョンのUnicodeですか?

私は Unicodeに関するウィキペディアの記事 を読みましたが、それは私にとって非常に困難です。簡単な答えが出るのを楽しみにしています。

211
nan

答えがないので、単純な答えは表示されません。

まず、Unicodeには「すべての言語のすべての文字」が含まれているわけではありませんが、実際に使用されています。

Unicode自体はマッピングであり、コードポイントを定義し、コードポイントは通常は文字に関連付けられた数字です。私は通常、文字を組み合わせるような概念があるので言います。あなたはアクセントやウムラウトのようなことに精通しているかもしれません。これらをauなどの別の文字と一緒に使用して、新しい論理文字を作成できます。したがって、文字は1つ以上のコードポイントで構成できます。

コンピューティングシステムで役立つためには、この情報の表現を選択する必要があります。これらは、utf-8、utf-16le、utf-32など、さまざまなUnicodeエンコーディングです。これらは、主にコードユニットのサイズによって区別されます。 UTF-32は最も単純なエンコーディングで、32ビットのコードユニットを持ちます。これは、個々のコードポイントがコードユニットに快適に収まることを意味します。他のエンコーディングでは、コードポイントが複数のcodeunitsを必要とする状況、またはエンコーディングで特定のコードポイントをまったく表現できない状況があります(これは、たとえばUCS-2の問題です)。

文字を組み合わせることの柔軟性のために、所与の符号化内であっても、文字当たりのバイト数は文字および正規化形式に応じて変わり得る。これは、複数の表現を持つ文字を処理するためのプロトコルです(2つのコードポイントである"an 'a' with an accent"、1つのコードポイントである1つの結合char、または"accented 'a'")。

130
Logan Capaldo

不思議なことに、1バイトのUnicode文字を取るバイト数を計算する方法は誰にもわかりませんでした。これはUTF-8でエンコードされた文字列の規則です。

Binary    Hex          Comments
0xxxxxxx  0x00..0x7F   Only byte of a 1-byte character encoding
10xxxxxx  0x80..0xBF   Continuation bytes (1-3 continuation bytes)
110xxxxx  0xC0..0xDF   First byte of a 2-byte character encoding
1110xxxx  0xE0..0xEF   First byte of a 3-byte character encoding
11110xxx  0xF0..0xF4   First byte of a 4-byte character encoding

つまり、最初の1バイトに応じて、1バイトから4バイトかかります。

更新

prewettが指摘したように、この規則はUTF-8にのみ適用されます

169
paul.ago

この質問は古く、すでに受け入れられた答えを持っていることを私は知っていますが、私はいくつかの例を提供したいと思います(それが誰かに役立つことを望みます)。

私が知っている限りでは、古いASCII文字は1文字あたり1バイトでした。

右。実際のところ、ASCIIは7ビットエンコーディングなので、128コード(うち95コードは印刷可能)をサポートしているので、(それが意味を成すのであれば)半分のバイトしか使用しません。

Unicode文字には何バイト必要ですか?

Unicodeは単に文字をコードポイントにマッピングします。エンコード方法は定義されていません。テキストファイルにはUnicode文字は含まれていませんが、Unicode文字を表すことができるバイト/オクテットが含まれています。

私は1つのUnicode文字があらゆる言語からのあらゆる可能な文字を含むことができると思います - 私は正しいですか?

いいえ。しかしほとんどです。そう基本的にそうです。それでもまだだ。

それで、それは1文字あたり何バイト必要でしょうか?

あなたの2番目の質問と同じです。

そして、UTF-7、UTF-6、UTF-16などはどういう意味ですか?それらはある種のUnicodeバージョンですか?

いいえ、それらはエンコーディングです。それらは、バイト/オクテットがどのようにUnicode文字を表すべきかを定義します。

いくつかの例ブラウザで表示できないものがある場合(おそらくフォントがそれらをサポートしていないため)、http://codepoints.net/U+1F6AA1F6AAを16進数のコードポイントに置き換えます)に移動して画像を表示します。

    • U + 0061ラテン文字A:a
      • Nº:97
      • UTF-8:61
      • UTF-16:00 61
    • U + 00A9著作権記号:©
      • N°:169
      • UTF-8:C2 A9
      • UTF-16:00 A9
    • U + 00A登録商標:®
      • °:174
      • UTF-8:C2 AE
      • UTF-16:00 AE
    • U + 1337 ETHIOPIC SYLLABLE PHWA:
      • N°:4919
      • UTF-8:E1 8C B7
      • UTF-16:13 37
    • U + 2014 EM DASH:
      • N°:8212
      • UTF-8:E2 80 94
      • UTF-16:20 14
    • U + 2030 PER MILLE SIGN:
      • N°:8240
      • UTF-8:E2 80 B0
      • UTF-16:20 30
    • U + 20ACユーロ記号:
      • °:8364
      • UTF-8:E2 82 AC
      • UTF-16:20 AC
    • U + 2122商標マーク:
      • N°:8482
      • UTF-8:E2 84 A2
      • UTF-16:21 22
    • U + 2603スノーマン:
      • N°:9731
      • UTF-8:E2 98 83
      • UTF-16:26 03
    • U + 260E黒電話:
      • N°:9742
      • UTF-8:E2 98 8E
      • UTF-16:26 0E
    • U + 2614雨滴のある傘:
      • N°:9748
      • UTF-8:E2 98 94
      • UTF-16:26 14
    • U + 263Aホワイトスマイルフェース:
      • N°:9786
      • UTF-8:E2 98 BA
      • UTF-16:26 3A
    • U + 2691ブラックフラッグ:
      • Nº:9873
      • UTF-8:E2 9A 91
      • UTF-16:26 91
    • U + 269B原子記号:
      • N°:9883
      • UTF-8:E2 9A 9B
      • UTF-16:26 9B
    • U + 2708飛行機:
      • N°:9992
      • UTF-8:E2 9C 88
      • UTF-16:27 08
    • U + 271E白いラテン文字の交差点:
      • Nº:10014
      • UTF-8:E2 9C 9E
      • UTF-16:27 1E
    • U + 3020郵便マーク面:
      • Nº:12320
      • UTF-8:E3 80 A0
      • UTF-16:30 20
    • U + 8089日中韓統一記号 - 8089:
      • N°:32905
      • UTF-8:E8 82 89
      • UTF-16:80 89
    • U + 1F4A9うんちの山:????
      • N°:128169
      • UTF-8:F0 9F 92 A9
      • UTF-16:D8 3D DC A9
    • U + 1F680ロケット:????
      • Nº:128640
      • UTF-8:F0 9F 9A 80
      • UTF-16:D8 3D DE 80

さて、私は夢中になっています...

おもしろ情報:

36
basic6

簡単に言うと、Unicodeは、世界のすべての文字に1つの番号(コードポイントと呼ばれる)を割り当てた標準です(まだ作業中です)。

このコードポイントをバイトで表す必要があります。これをcharacter encodingと呼びます。 UTF-8, UTF-16, UTF-6はそれらの文字を表現する方法です。

UTF-8はマルチバイト文字エンコードです。文字は1から6バイトを持つことができます(それらのうちのいくつかは今必要ではないかもしれません)。

UTF-32各文字は4バイトの文字を持ちます。

UTF-16は各文字に16ビットを使用し、それはBMPと呼ばれるUnicode文字の一部のみを表します(すべての実用的な目的に十分です)。 Javaはこのエンコーディングを文字列で使用します。

27
Zimbabao

UTF-8の場合:

1 byte:       0 -     7F     (ASCII)
2 bytes:     80 -    7FF     (all European plus some Middle Eastern)
3 bytes:    800 -   FFFF     (multilingual plane incl. the top 1792 and private-use)
4 bytes:  10000 - 10FFFF

UTF-16の場合:

2 bytes:      0 -   D7FF     (multilingual plane except the top 1792 and private-use )
4 bytes:   D800 - 10FFFF

UTF-32の場合:

4 bytes:      0 - 10FFFF

10FFFFは定義上最後のUnicodeコードポイントであり、それはUTF-16の技術的な限界のためにそのように定義されています。

これはUTF-8が4バイトでエンコードできる最大のコードポイントでもありますが、UTF-8のエンコードの背後にある考え方は7FFFFFFFまでのコードポイントをカバーする5および6バイトのエンコードにも有効です。 UTF-32ができることの半分。

13
John

Unicodeでは、答えは簡単には与えられません。あなたがすでに指摘したように、問題はエンコーディングです。

発音区別符号のない英語の文であれば、UTF-8の回答は文字数と同じバイト数になり、UTF-16の回答は文字数の2倍になります。

(今のところ)サイズに関するステートメントを作成できる唯一のエンコーディングはUTF-32です。コードポイントは将来のUTF-64用に準備されていると思いますが、1文字あたり常に32ビットです。

それを非常に難しくしているのは、少なくとも2つのことです。

  1. すでにアクセント記号付き/発音区別符号(À)である文字実体を使用する代わりに、ユーザーはアクセント文字と基本文字( `A)を組み合わせることにしました。
  2. コードポイントコードポイントは、UTFコード化がそれらに彼らの名前を与えるビットの数が通常許すより多くのエンコードを許す方法です。例えば。 UTF-8はそれ自体では無効な特定のバイトを指定しますが、その後に有効な継続バイトが続くと、8ビットの範囲である0..255を超える文字を記述することができます。以下の およびUTF-8に関するウィキペディアの記事の「長すぎるエンコード」を参照してください。
    • そこに与えられた優れた例は€文字(コードポイントU+20AC3バイトシーケンスE2 82 ACまたは4バイトシーケンスF0 82 82 AC
    • どちらも有効で、これは「Unicode」について話すときの答えがどれほど複雑かを示しており、UTF-8やUTF-16などのUnicodeの特定のエンコードについては話していません。
8
0xC0000022L

UTF-8で任意の文字列のバイト数を計算するための優れたツールがあります。 http://mothereff.in/byte-counter

更新:@mathiasはコードを公開しました: https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js

7
Nic Cottrell

Wikipediaのページも取り上げました。イントロ部分では、「Unicodeはさまざまな文字エンコードで実装できます。最も一般的に使用されるエンコードはUTF-8(すべてのASCII文字。UTF-8およびASCIIエンコードの両方で同じコード値を持ち、他の文字には最大4バイト)、現在廃止されたU​​CS-2(各文字に2バイトを使用)ただし、現在のUnicode標準のすべての文字をエンコードすることはできません)」

この引用が示すように、あなたの問題は、ユニコードが文字をエンコードする単一の方法であると仮定していることです。実際には、ユニコードには複数の形式があり、その引用文でも、そのうちの1つは、あなたが慣れているのと同じように1文字につき1バイトです。

あなたが望むあなたの簡単な答えは、それが変化するということです。

4
Loduwijk

UTF-16の場合、0xD800以上で始まる文字は4バイト(2コード単位)必要です。そのような文字は「サロゲートペア」と呼ばれます。より具体的には、代理ペアは次の形式を取ります。

[0xD800 - 0xDBFF]  [0xDC00 - 0xDFF]

[...]は、指定された範囲の2バイトコード単位を示します。 0xD7FF以下は1コード単位(2バイト)です。 0xE000以上のものは無効です(BOMマーカーを除く、おそらく)。

http://unicodebook.readthedocs.io/unicode_encodings.html 、セクション7.5を参照してください。

3
prewett

これをチェックしてください Unicodeコード変換プログラム 。たとえば、0x2009と入力します。 2009は、 "0x ... notation"フィールドにシンスペースのUnicode番号 で、[変換]をクリックします。 「UTF-8 code units」フィールドに16進数のE2 80 89(3バイト)が表示されます。

1
ma11hew28