web-dev-qa-db-ja.com

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

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

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

31
khajvah

主流のコンピュータで使用するために開発される最初のエンコーディングスキームの1つは [〜#〜] ascii [〜#〜]American Standard Code for Information Interchangeです。 )標準。 1960年代にアメリカで開発されました。

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

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

最近世界中でコンピューターの使用が増加しているため、さまざまな言語のコンピューターを利用する人がますます増えています。つまり、言語ごとに、他のスキームとは無関係に新しいエンコーディングスキームを開発する必要があり、異なる言語の端末から読み取ると競合することになります。

nicode は、考えられるすべての意味のある文字を1つの抽象文字セットにマージすることにより、さまざまな端末の存在に対する解決策として提供されました。

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

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

41

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

これ以上の可能性を必要とする言語では、単純な1対1のマッピングを維持できないため、文字を格納するためにより多くのデータが必要です。

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

17
ernie

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

10
Jason

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

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

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

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

3

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

文章のミキシングなど英語とスペイン語はうまくいきました(Latin-1を使用し、両方のスーパーセットを使用してください)。ただし、異なるエンコーディングを使用するもの(たとえば、ギリシャ語またはロシア語のスニペットを含め、日本語のようなアジア言語は言うまでもありません)を混在させることは、非常に悪夢でした。最悪だったのは、ロシア語、特に日本語と中国語に、完全に互換性のない人気のあるエンコードがいくつかあったことです。

今日では、Unicodeを使用しています。これは、UTF-8のような効率的なエンコーディングに対応しており、英語の文字を優先します(驚いたことに、英語の文字のエンコーディングはたまたまASCIIに対応しているため)。

3
vonbrand

文字の格納方法に興味がある場合は、www.unicode.orgにアクセスして見てください。メインページの上部には、 "Code Charts"のリンクがあり、Unicodeで利用可能なすべての文字コードが表示されます。

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

代わりに、Unicodeは通常、一部の文字にはより少ないバイトを使用し、他の文字にはより多くのバイトを使用する「UTF-8」エンコーディングで格納されます。最初の128個のコード値は1バイトに保存され、最初の2048個までのコード値は2バイトに保存され、最大65536個は3バイトに保存され、残りは4バイトになります。これは、頻繁に使用されるコード値が占めるスペースが少なくなるように調整されています。 AZ、az、0-9および!@ $%^&*()-[} {}; ': "|、。/ <>?および忘れてしまったものは1バイトを取る;ほとんどすべての英語、98%ドイツ語とフランス語(推測のみ)は、文字ごとに1バイトで格納でき、これらは最もよく使用される文字です。キリル文字、ギリシャ語、ヘブライ語、アラビア語など、文字ごとに2バイトを使用します。インド言語、ほとんどの中国語、日本語、韓国語、タイ語、数トンの数学記号は、1文字あたり3バイトで記述できます。まれに(Linear AまたはLinear 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エンコード文字で自動的に正しく機能します。

さらに、私が忘れていた理由は何でも。

2
gnasher729

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

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

メモ帳で「ա」が1つ保存されたファイル

  • 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になります。

2
Darryl Braaten