なぜ英語の文字は、他のアルファベットよりも少ないバイト数で表現できるのですか?


31

テキストファイルに「a」を入れると2バイトになりますが、アルメニア語のアルファベットである「ա」と言うと、3バイトになります。

コンピューターのアルファベットの違いは何ですか?
英語のスペースが少ないのはなぜですか?


22
StackExchangeの創設者がこの記事を読む必要があります。joelonsoftware.com/ articles
Eric Lippert

22
「英語のキャラクター」というものはないと思います。彼らはローマ人です。
ラファエル14

5
@Raphael誰もが彼が何を言っているか知っています。でもいいですね。
マティアスリュックガードローレンツェン14

1
@Raphael実際、英語では使用されないローマ字が多くあり、ASCII文字セットには含まれていません。それらのほとんどには修飾子が含まれていますが、英語以外のさまざまなラテン語由来の言語でテキストを適切にレンダリングするためには、修飾子が依然として必要です。
ウタズ14

7
@Raphael「ローマ字」のようなものはないと思います。彼らはラテン語です。
ブラックライトシャイニング

回答:


41

主流のコンピューターで使用するために開発された最初のエンコード方式の1つは、ASCII情報交換のためのアメリカ標準コード)標準です。1960年代に米国で開発されました。

英語のアルファベットは、ラテン系のアルファベットの一部を使用します(たとえば、英語にはアクセント付きの単語はほとんどありません)。そのアルファベットには26個の個別の文字があり、大文字と小文字は区別されません。また、英語のアルファベットをエンコードするふりをするスキームには、個々の数字と句読点が存在する必要があります。

1960年代は、コンピューターに現在のメモリやディスク容量がなかった時代でもありました。ASCIIは、すべてのアメリカのコンピューターで機能するアルファベットの標準表現になるように開発されました。当時、すべてのASCII文字を8ビット(1バイト)の長さにするという決定は、当時の技術的な詳細のために行われました(ウィキペディアの記事では、穴あきテープが一度に8ビットを保持するという事実に言及しています)。実際、元のASCIIスキームは7ビットを使用して送信でき、8ビットはパリティチェックに使用できます。その後の開発により、元のASCIIスキームが拡張され、いくつかのアクセント付き、数学、および終端文字が含まれるようになりました。

最近、世界中でコンピューターが使用されるようになり、さまざまな言語のユーザーがコンピューターにアクセスできるようになりました。つまり、各言語について、他のスキームとは独立して新しいエンコーディングスキームを開発する必要があり、異なる言語の端末から読み取ると競合することになります。

ユニコードは、考えられるすべての意味のある文字を単一の抽象文字セットにマージすることにより、さまざまな端末の存在に対する解決策として生まれました。

UTF-8は、Unicode文字セットをエンコードする1つの方法です。これは可変幅のエンコーディングで(たとえば、異なる文字は異なるサイズを持つことができます)、以前のASCIIスキームとの後方互換性のために設計されました。そのため、ASCII文字セットは1バイトの大きさのままですが、他の文字は2バイト以上の大きさです。UTF-16は、Unicode文字セットをエンコードする別の方法です。UTF-8と比較して、文字は1つまたは2つの16ビットコード単位のセットとしてエンコードされます。

コメントで述べたように、「a」文字は1バイトを占め、「ա」は2バイトを占め、UTF-8エンコードを示します。あなたの質問の余分なバイトは、末尾に改行文字が存在するためです(OPはそれを知りました)。


26
通常のエンコーディングまたはファイル形式で、ファイルの終わりをコードする最後のバイトはありません。プログラムがファイルを読み取ると、ファイルの終わりが特別な方法でOSによって通知される場合がありますが、それは別の問題です。
ユッカK.コルペラ14

2
Unicode文字のUTF-8バージョンでは、ա文字は2バイト(0xD5A1)です。余分な文字(何でも)は両方のファイルに存在します。 marathon-studios.com/unicode/U0561/Armenian_Small_Letter_Ayb
ダンニーリー14

6
@khajvahあなたecho 'ա' > file.txt、またはいくつかのエディターを使用してファイルを編集すると、自動的に改行が追加されます。を実行するxxd file.txtと、最後のバイトはおそらく0a、またはラインフィードになります。
ダニエルベック

7
@DoktoroReichard:ユニコードはエンコードではないという答えを明確にしてください。むしろ、それは抽象文字セットであり、UTF-16とUTF-8はUnicodeコードポイントのエンコードです。答えの最後の段落では、ほとんどがUTF-8について説明しています。ただし、ファイルがUTF-16を使用する場合、のコードポイントでも、a2バイト(または2の倍数)を使用します。
悲しみ14

6
また、「拡張ASCII」文字セットは実際にはまったくASCIIでなく、8ビット目を利用するさまざまな方法がそれをすべて混乱させることを強調する価値があるでしょう。代わりにUTF-8を使用してください。
NTOSKRNL

17

1バイトは8ビットであるため、最大256(2 ^ 8)の異なる値を表すことができます。

これよりも多くの可能性を必要とする言語では、単純な1対1のマッピングを維持できないため、キャラクターを保存するためにより多くのデータが必要です。

一般に、ほとんどのエンコードではASCII文字に最初の7ビット(128値)が使用されることに注意してください。これにより、8番目のビット、つまりより多くの文字に対して128個の値が残ります。。。アクセント付き文字、アジア言語、キリル文字などを追加すると、すべての文字を保持するのに1バイトでは不十分な理由が簡単にわかります。


ので、ここでは、実際に多くのスペースが使用されている理由を説明する唯一の答えである
フェリックス・ガニオン-グルニエ

10

UTF-8では、ASCII文字は1バイトを使用し、他の文字は2、3、または4バイトを使用します。


1
これがなぜなのか詳しく説明していただけますか?2つのエンコード方式に注目しても、質問にはまったく答えられません。
MaQleod 14

@MaQleod Unicodeは、ASCIIを置き換えるために作成されました。後方互換性のために、最初の128文字は同じです。これらの128文字は1バイトで表現できます。追加の文字用に追加のバイトが追加されます。
ジェイソン14

私は承知していますが、それは、ASCII文字が何が違うのかという質問に対する答えの一部です。OPに説明する必要があります。
MaQleod 14

@MaQleodまた、Unicodeコンソーシアムは主にアメリカの企業で構成されており、英語の文字に偏っていたとも言えます。単純な答えは主観的な答えよりも良いと思いました。
ジェイソン14

15
「Unicode」ではなく、UTF8-Unicode文字セットのいくつかのエンコーディングの1つにすぎません。
セバスチャンネグラスズ14

3

文字に必要なバイトの量(これは明らかに問題になっています)は、文字エンコーディングによって異なります。ArmSCIIエンコーディングを使用する場合、各アルメニア文字は1バイトだけを占有します。しかし、最近ではあまり良い選択ではありません。

UnicodeのUTF-8転送エンコードでは、文字に異なるバイト数が必要です。その中で、「a」はたった1バイト(2バイトについての考えはある種の混乱です)、「á」は2バイト、アルメニア文字ayb「ա」も2バイトかかります。3バイトはある種の混乱でなければなりません。対照的に、例えばベンガル語の文字「a」はUTF-8で3バイトを使用します。

背景は、UTF-8がアスキー文字に対して非常に効率的で、ヨーロッパおよびその周辺の書記システムに対して非常に効率的であり、他のすべてがそれほど効率的でないように設計されたということです。これは、基本的なラテン文字(英語のテキストの大部分を構成している)で、文字に必要なのは1バイトだけであることを意味します。ギリシャ語、キリル文字、アルメニア語、および他のいくつかの場合、2バイトが必要です。残りはすべてもっと必要です。

UTF-8は、(コメントで指摘されているように)Asciiデータ(長い間ほとんど唯一の方法であった8ビット単位で表される場合)もUTF-8でエンコードされるという便利なプロパティを持っています。


答えてくれてありがとう。追加のバイトは、使用したプログラムが自動的に改行文字を末尾に追加したためです。
khajvah

1
UTF-8は、互換性に関してはASCIIデータの効率のためにあまり設計されていないと思います。UTF-8には、7ビットASCIIコンテンツ(高ビットをゼロに設定)がUTF-8としてエンコードされた同じコンテンツと同一であるという非常に優れた特性があるため、通常ASCIIを処理するツールの場合、ドロップイン置換。私の知る限り、他のUnicodeエンコーディングスキームにはその特性はありません。UTF-8は、特にUnicode BMPの領域内に留まる場合は特に、ほとんどのデータでかなりコンパクトです。
CVn

1
@MichaelKjörling、その機能への参照を追加しました。ただし、初期のユニコードに対する大きな反対は非効率であり、UTF-16は主にアスキーであるデータのサイズを2倍にします。UTF-8は、たとえば英語のテキストの場合、使用する非ASCII文字に対してのみ「支払う」ことを意味します。
ユッカK.コルペラ14

3

1960年代(およびそれ以降)の文字コードはマシン固有でした。1980年代、私は簡単にDEC 2020マシンを使用しました。これは36ビットワードで、文字エンコードごとに5、6、8IIRC)ビットでした。その前に、IBM 370シリーズとEBCDICを使用しました。ASCIIは7ビットの順序をもたらしましたが、プリミティブメニューを描画するためのあらゆる種類のボックス描画や、Latin-1(8ビットのような後のASCII拡張)のような、8ビットすべてを使用してIBM PC「コードページ」を混乱させましたASCIIと「国家文字」等の他の半分のような最初の7ビットのエンコーディング、ñÇ、または他の人。おそらく最も人気のあるラテン文字使って英語とほとんどのヨーロッパの言語に合わせ、ラテン-1だった(とアクセントをして変異体)。

英語とスペイン語などのテキストミキシングを書くことはうまくいきましたが(ラテン-1、両方のスーパーセットを使用してください)、異なるエンコードを使用するもの(ギリシャ語やロシア語のスニペットなど、日本語のようなアジア言語はもちろんのこと)を混合することは真の悪夢。最悪だったのは、ロシア語、特に日本語と中国語には、いくつかの一般的で完全に互換性のないエンコーディングがあったことです。

今日、私たちはUnicodeを使用しています。これは、英語文字を優先するUTF-8などの効率的なエンコード(驚くべきことに、英語の文字のエンコードはたまたまASCIIに対応しています)に対応しているため、英語以外の多くの文字でより長いエンコードを使用しています。


2

メモ帳で保存された単一の「a」を含むWindows 8.1 US / Englishファイル。

  • AS ANSI 1バイトを保存
  • AS Unicode 4バイトを保存
  • AS UTF-8 4バイトを保存

メモ帳で保存された単一の「ա」を持つファイル

  • AS ANSIを保存できません
  • AS Unicode 4バイトを保存
  • AS UTF-8 5バイトを保存

単一の「a」はANSIで単一バイトとしてエンコードされます。Unicodeでは、各文字は通常2バイトで、ファイルの先頭に2バイトのBOM(バイトオーダーマーカー)もあります。UTF-8には3バイトのBOMと1バイト文字があります。

「ա」の場合、その文字はANSI文字セットに存在せず、マシンに保存できません。Unicodeファイルは以前と同じで、UTF-8ファイルは文字が2バイトかかるため1バイト大きくなります。

マシンが異なる地域にある場合は、ASCII範囲で255文字の異なるグリフを持つ異なるOEMコードページがインストールされている可能性があります。@ntoskrnlが述べたように、私のマシンのOEMコードページは米国英語のデフォルトであるWindows-1252になります。


4
メモ帳(およびWindows全般)では、ここではわかりにくい用語を使用しています。「ANSI」はロケール依存のシングルバイトエンコーディング(英語版のWindows-1252)、「Unicode」はUTF-16です。
NTOSKRNL

@ntoskrnlそれは正しいですが、エンコード用のドロップボックスを見るとANSIと表示されているため、異なるOEMコードページがある場合、異なる結果が得られる可能性があると述べました。
ダリルブラーテン14

2

キャラクターの保存方法に興味がある場合は、www.unicode.orgにアクセスして見て回ってください。メインページの上部には、「コードチャート」リンクがあり、Unicodeで使用可能なすべての文字コードが表示されます。

全体として、ユニコードで利用可能なコードは100万を少し超えています(すべてが使用されているわけではありません)。1バイトは256の異なる値を保持できるため、可能なすべてのUnicodeコードを保存する場合は3バイトが必要になります。

代わりに、Unicodeは通常、一部の文字に使用するバイト数を減らし、他の文字に使用するバイト数を増やす「UTF-8」エンコーディングで保存されます。最初の128個のコード値は1バイトで保存され、最初の2048個のコード値は2バイトで保存され、最大65536は3バイトで保存され、残りは4バイトで保存されます。これは、使用されるコード値が頻繁に使用するスペースが少なくなるように調整されています。AZ、az、0-9、および!@ $%^&*()-[} {}; ': "|、。/ <>?と、1バイト取るのを忘れたもの。英語のほとんどすべて、98%ドイツ語とフランス語(推測)は1文字につき1バイトで保存でき、これらが最も使用される文字ですキリル文字、ギリシャ語、ヘブライ語、アラビア語、およびその他の文字は1文字につき2バイトを使用します。 、韓国語、タイ語、大量の数学記号、文字ごとに3バイトで書き込むことができます。まれなこと(線形Aまたは線形Bでテキストを記述したい場合、絵文字)は4バイトかかります。

別のエンコーディングはUTF-16です。UTF-8で1、2、または3バイトを使用するものはすべて、UTF-16で2バイトを使用します。中国語または日本語のテキストの間にラテン文字がほとんどない場合、これは利点です。

UTF-8設計の理由について:他の設計に比べていくつかの利点があります。彼らです:

US-ASCII文字との互換性

合理的なコンパクトさ

自己同期:これは、UTF-8エンコーディングの文字であるバイトシーケンスの一部が与えられた場合、文字の開始位置を見つけることができることを意味します。一部のエンコードでは、xyとyxの両方が文字の有効なエンコードである可能性があるため、シーケンス... xyxyxyxyxyxy ...の一部が与えられた場合、使用している文字がわかりません。

並べ替えの正確さ:UTF-8エンコード文字を含む文字列をバイト値で並べ替えると、Unicode値に従って自動的に正しく並べ替えられます。

シングルバイトコードとの互換性:シングルバイト値を前提とするほとんどのコードは、UTF-8エンコード文字で自動的に正しく機能します。

加えて、私が忘れた理由は何でも。

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