テキストファイルに「a」を入れると2バイトになりますが、アルメニア語のアルファベットである「ա」と言うと、3バイトになります。
コンピューターのアルファベットの違いは何ですか?
英語のスペースが少ないのはなぜですか?
テキストファイルに「a」を入れると2バイトになりますが、アルメニア語のアルファベットである「ա」と言うと、3バイトになります。
コンピューターのアルファベットの違いは何ですか?
英語のスペースが少ないのはなぜですか?
回答:
主流のコンピューターで使用するために開発された最初のエンコード方式の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はそれを知りました)。
echo 'ա' > file.txt
、またはいくつかのエディターを使用してファイルを編集すると、自動的に改行が追加されます。を実行するxxd file.txt
と、最後のバイトはおそらく0a
、またはラインフィードになります。
a
2バイト(または2の倍数)を使用します。
1バイトは8ビットであるため、最大256(2 ^ 8)の異なる値を表すことができます。
これよりも多くの可能性を必要とする言語では、単純な1対1のマッピングを維持できないため、キャラクターを保存するためにより多くのデータが必要です。
一般に、ほとんどのエンコードではASCII文字に最初の7ビット(128値)が使用されることに注意してください。これにより、8番目のビット、つまりより多くの文字に対して128個の値が残ります。。。アクセント付き文字、アジア言語、キリル文字などを追加すると、すべての文字を保持するのに1バイトでは不十分な理由が簡単にわかります。
UTF-8では、ASCII文字は1バイトを使用し、他の文字は2、3、または4バイトを使用します。
文字に必要なバイトの量(これは明らかに問題になっています)は、文字エンコーディングによって異なります。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でエンコードされるという便利なプロパティを持っています。
1960年代(およびそれ以降)の文字コードはマシン固有でした。1980年代、私は簡単にDEC 2020マシンを使用しました。これは36ビットワードで、文字エンコードごとに5、6、8(IIRC)ビットでした。その前に、IBM 370シリーズとEBCDICを使用しました。ASCIIは7ビットの順序をもたらしましたが、プリミティブメニューを描画するためのあらゆる種類のボックス描画や、Latin-1(8ビットのような後のASCII拡張)のような、8ビットすべてを使用してIBM PC「コードページ」を混乱させましたASCIIと「国家文字」等の他の半分のような最初の7ビットのエンコーディング、ñ
、Ç
、または他の人。おそらく最も人気のあるラテン文字使って英語とほとんどのヨーロッパの言語に合わせ、ラテン-1だった(とアクセントをして変異体)。
英語とスペイン語などのテキストミキシングを書くことはうまくいきましたが(ラテン-1、両方のスーパーセットを使用してください)、異なるエンコードを使用するもの(ギリシャ語やロシア語のスニペットなど、日本語のようなアジア言語はもちろんのこと)を混合することは真の悪夢。最悪だったのは、ロシア語、特に日本語と中国語には、いくつかの一般的で完全に互換性のないエンコーディングがあったことです。
今日、私たちはUnicodeを使用しています。これは、英語文字を優先するUTF-8などの効率的なエンコード(驚くべきことに、英語の文字のエンコードはたまたまASCIIに対応しています)に対応しているため、英語以外の多くの文字でより長いエンコードを使用しています。
メモ帳で保存された単一の「a」を含むWindows 8.1 US / Englishファイル。
メモ帳で保存された単一の「ա」を持つファイル
単一の「a」はANSIで単一バイトとしてエンコードされます。Unicodeでは、各文字は通常2バイトで、ファイルの先頭に2バイトのBOM(バイトオーダーマーカー)もあります。UTF-8には3バイトのBOMと1バイト文字があります。
「ա」の場合、その文字はANSI文字セットに存在せず、マシンに保存できません。Unicodeファイルは以前と同じで、UTF-8ファイルは文字が2バイトかかるため1バイト大きくなります。
マシンが異なる地域にある場合は、ASCII範囲で255文字の異なるグリフを持つ異なるOEMコードページがインストールされている可能性があります。@ntoskrnlが述べたように、私のマシンのOEMコードページは米国英語のデフォルトであるWindows-1252になります。
キャラクターの保存方法に興味がある場合は、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エンコード文字で自動的に正しく機能します。
加えて、私が忘れた理由は何でも。