バイトと文字の違いは何ですか(少なくとも* nixwise)?

バイトと文字の違いは何ですか(少なくとも* nixwise)?

私はすべての文字が1つ以上のバイトで構成されていることを知っています。

私の記憶が正しい場合、少なくとも* nixオペレーティングシステムでは、文字は通常(または排他的に)1バイトのみで構成されます。

バイトと文字の違いは何ですか(少なくとも* nixwise)?

答え1

POSIXly、強調表示:

3.87 文字
シーケンス1 つ以上のバイト単一のグラフィック記号または制御コードを表します。

実際に正確な意味は、実際のロケールによって異なります。たとえば、「C」ロケールはprintf '\xc3\xa4\xc3\xb6' |wc -mバイトを効果的に計算するため、4を提供し、UTF-8ロケールはTwo UTF-8エンコードされた文字なので2を提供しますäö。端末もUTF-8に設定されていると仮定するともちろんprintf 'äö'

wc -c文字ではなくバイト数を計算するように定義されており、混乱しやすいです。)

悪いことに、文字サポートもユーティリティによって異なり、すべてがマルチバイト文字をきちんと処理するわけではありません(Unicodeのすべての欠点は言うまでもありません)。たとえば、GNU tr はマニュアルページに関係なくバイトを処理します。

$ printf ä | tr ä xy; echo
xx
$ printf ö | tr ä xy; echo
x�

最初のものはと同じでtr '\303\244' 'xy'あるため、両方のバイトがä置き換えられますが、2番目のものは2バイトの最初のバイトがä同じであるために発生しますö。もちろん、実際に文字を処理する場合は、その文字を印刷する必要xがありますö

答え2

通常、バイトはPOSIXの定義8。ビットはバイナリです(つまり、基本数値1または0ほぼすべての数値計算の基礎)。

あるキャラクターはよくバイトは、一部のコンテキスト(ASCIIなど)でバイト長として定義できます。ただし、Unicode、UTF-8、およびUTF-16は、単一文字(または文字の外観)が1バイトより長いデータペイロードとして定義できる拡張文字セットを定義します。

単一文字:

Q̴̢̪̘̳̣̞̩̪̑̍̉̆̉͛̑̂̕͝

は単一の文字ですが、基本的な文字の外観(簡単)に複数のアクセント(または発音区別記号)を適用することによって行われますQ。このエンコーディングは長さより多くのバイトを使用します。その文字をファイルに入れて自分のロケールにコンテンツを表示するhexdump代わりに使用します。cat:

$ hexdump -C demo
00000000  51 cc b4 cc 91 cc 8d cc  89 cc 86 cc 89 cd 9d cd  |Q...............|
00000010  9b cc 91 cc 95 cc 82 cc  aa cc 98 cc b3 cc a3 cc  |................|
00000020  a2 cc 9e cc a9 cc aa 0a                           |........|
00000028

答え3

バイト基本要素として、通常長さは8ビットです(とも呼ばれます)。八重奏)、他のサイズもありましたが、おそらくまだあります。 8ビットバイトを使用すると、256個の異なる値(0から255まで)をエンコードできます。

文字の場合、使用されるエンコードと文字セットによって状況が異なります。

  • 最も単純で最も一般的なエンコーディング/文字セットは次のとおりです。ASCIIコード。すべてのキャラクターが使用する1バイト(実際にはそれより少ないです。7ビットにすぎません)。発音区別記号(アクセントなど)のない英語のアルファベットの小文字と大文字、数字、一般的な句読点、および制御文字が含まれます。

  • その後、一連の8ビット文字セットがあります。ISO-8859シリーズ、MS-DOS、WindowsコードページMac 文字セット、等。

    これはASCIIの上位セット(最初の128値はASCIIと同じです)、残りの128値はロケール固有の文字(アクセント文字、ギリシャ語、キリル文字などの代替スクリプト...)用です。

    すべてのコンピュータが同じ文字セットを使用しているわけではないため、コンピュータ間またはプログラム間でファイルを転送すると、あらゆる種類の問題が発生する可能性があります。

    この場合、まだ役割があります。1バイト

  • 以来Unicodeコレクション内のすべてを統合しようとするファミリは、明らかに256より大きいので、単一バイトに入ることはできません。

  • 最初は16ビットで十分だと考えてUCS-2を設計しました。2バイト1文字あたり(これは最大65536文字を意味しますが、すべて割り当てられませんがUTF-16を許可します)。

  • それから、2バイトが常に十分ではないことが明らかになりました。そこでUTF-16が導入されました。エージェントペア追加の文字をエンコードします。 BMP(Basic Multilingual Plane)文字の場合は、以下を使用します。2バイト正しいです。ただし、「追加」文字の場合は、合計2バイトずつ2つのコード単位を使用します。4バイト

    UTF-16は、Windows NTおよびそれ以降のバージョンのデフォルトのエンコーディングです。しかし、UTF-16にも問題があります。誰もが2バイトの順序(リトルエンディアンまたはビッグエンディアン)に同意しないため、UTF-16LEとUTF-16BEがあります。 BOMの有無にかかわらず。

  • UCS-4およびUTF-32も使用されます。4バイト文字あたり(UTF-32はUTF-16で表現できる値に制限されています)が、これは非常にまれです。

  • UTF-8はおそらく最も一般的なエンコーディングとなっている可変長エンコーディングです。文字はどこでもエンコードできます。1~4バイトの間

    UTF-8の利点は、UnicodeのASCII部分(コードポイント0〜127)がまだシングルバイトでエンコードされ、その範囲外のコードポイントに0〜127の間のバイトが含まれないことです。これにより、パス/(またはまたは\:、プログラミング言語、シェルの多くの句読点(!=+-*/^"'<>[]{}など)、制御文字(CR、LFまたはタブ、スペースなど)などがあります。

しかし、Unicodeには追加の複雑さがあります。コードポイント結合可能é単一文字é(U + 00E9 LATIN SMALL LETTER E AND ACUTE)でエンコードするかe(U + 0065 LATIN SMALL LETTER E)の後に◌́(U + 0301 COMBINING ACUTE ACCENT)でエンコードできます。図からわかるようにドゥブゴッティの答え、一文字にかなり多くの組み合わせ記号を積み重ねることができます!

分音符はコードポイントの唯一の組み合わせではありません。変形、特に絵文字を作る方法はたくさんあります。肌の色を変更できます(

関連情報