エンコーディングについて少し混乱しています。私が知っている限りでは、古いASCII文字は1文字あたり1バイトでした。 Unicode文字には何バイト必要ですか?
私は1つのUnicode文字があらゆる言語からのあらゆる可能な文字を含むことができると思います - 私は正しいですか?それで、それは1文字あたり何バイト必要でしょうか?
そして、UTF-7、UTF-6、UTF-16などはどういう意味ですか?それらは異なるバージョンのUnicodeですか?
私は Unicodeに関するウィキペディアの記事 を読みましたが、それは私にとって非常に困難です。簡単な答えが出るのを楽しみにしています。
答えがないので、単純な答えは表示されません。
まず、Unicodeには「すべての言語のすべての文字」が含まれているわけではありませんが、実際に使用されています。
Unicode自体はマッピングであり、コードポイントを定義し、コードポイントは通常は文字に関連付けられた数字です。私は通常、文字を組み合わせるような概念があるので言います。あなたはアクセントやウムラウトのようなことに精通しているかもしれません。これらをa
やu
などの別の文字と一緒に使用して、新しい論理文字を作成できます。したがって、文字は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'"
)。
不思議なことに、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にのみ適用されます
この質問は古く、すでに受け入れられた答えを持っていることを私は知っていますが、私はいくつかの例を提供したいと思います(それが誰かに役立つことを望みます)。
私が知っている限りでは、古い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+1F6AA
(1F6AA
を16進数のコードポイントに置き換えます)に移動して画像を表示します。
a
©
®
ጷ
—
‰
€
™
☃
☎
☔
☺
⚑
⚛
✈
✞
〠
肉
????
????
さて、私は夢中になっています...
おもしろ情報:
簡単に言うと、Unicode
は、世界のすべての文字に1つの番号(コードポイントと呼ばれる)を割り当てた標準です(まだ作業中です)。
このコードポイントをバイトで表す必要があります。これをcharacter encoding
と呼びます。 UTF-8, UTF-16, UTF-6
はそれらの文字を表現する方法です。
UTF-8
はマルチバイト文字エンコードです。文字は1から6バイトを持つことができます(それらのうちのいくつかは今必要ではないかもしれません)。
UTF-32
各文字は4バイトの文字を持ちます。
UTF-16
は各文字に16ビットを使用し、それはBMPと呼ばれるUnicode文字の一部のみを表します(すべての実用的な目的に十分です)。 Javaはこのエンコーディングを文字列で使用します。
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ができることの半分。
Unicodeでは、答えは簡単には与えられません。あなたがすでに指摘したように、問題はエンコーディングです。
発音区別符号のない英語の文であれば、UTF-8の回答は文字数と同じバイト数になり、UTF-16の回答は文字数の2倍になります。
(今のところ)サイズに関するステートメントを作成できる唯一のエンコーディングはUTF-32です。コードポイントは将来のUTF-64用に準備されていると思いますが、1文字あたり常に32ビットです。
それを非常に難しくしているのは、少なくとも2つのことです。
U+20AC
は3バイトシーケンスE2 82 AC
または4バイトシーケンスF0 82 82 AC
。UTF-8で任意の文字列のバイト数を計算するための優れたツールがあります。 http://mothereff.in/byte-counter
更新:@mathiasはコードを公開しました: https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js
Wikipediaのページも取り上げました。イントロ部分では、「Unicodeはさまざまな文字エンコードで実装できます。最も一般的に使用されるエンコードはUTF-8(すべてのASCII文字。UTF-8およびASCIIエンコードの両方で同じコード値を持ち、他の文字には最大4バイト)、現在廃止されたUCS-2(各文字に2バイトを使用)ただし、現在のUnicode標準のすべての文字をエンコードすることはできません)」
この引用が示すように、あなたの問題は、ユニコードが文字をエンコードする単一の方法であると仮定していることです。実際には、ユニコードには複数の形式があり、その引用文でも、そのうちの1つは、あなたが慣れているのと同じように1文字につき1バイトです。
あなたが望むあなたの簡単な答えは、それが変化するということです。
UTF-16の場合、0xD800以上で始まる文字は4バイト(2コード単位)必要です。そのような文字は「サロゲートペア」と呼ばれます。より具体的には、代理ペアは次の形式を取ります。
[0xD800 - 0xDBFF] [0xDC00 - 0xDFF]
[...]は、指定された範囲の2バイトコード単位を示します。 0xD7FF以下は1コード単位(2バイト)です。 0xE000以上のものは無効です(BOMマーカーを除く、おそらく)。
http://unicodebook.readthedocs.io/unicode_encodings.html 、セクション7.5を参照してください。
これをチェックしてください Unicodeコード変換プログラム 。たとえば、0x2009
と入力します。 2009は、 "0x ... notation"フィールドにシンスペースのUnicode番号 で、[変換]をクリックします。 「UTF-8 code units」フィールドに16進数のE2 80 89
(3バイト)が表示されます。