UTF-8よりもASCIIエンコードを選択する利点は何ですか?


91

ASCIIのすべての文字は、ストレージを増やすことなくUTF-8を使用してエンコードできます(どちらも1バイトのストレージが必要です)。

UTF-8には、「ASCII文字」を超える文字サポートの利点があります。その場合は、なぜ我々がします今までに UTF-8を超えるASCIIエンコードを選ぶのか?

UTF-8の代わりにASCIIを選択するユースケースはありますか?


9
...従来のものをサポートするために
fretje

9
UTF8 合法的にASCIIをサポートしています。したがって、レガシーなものをサポートする必要がある場合でも、UTF8は他の変更を必要とせずに正常に機能します。
Pacerier

3
8個のASCII文字を7バイトにパックするシステムと相互運用する必要があるかもしれません。人々がやったクレイジーで物事を合わせてものを。
ドナル・フェロー

4
ナッツと呼びますが、セキュリティと安定性は言うでしょう。マルチバイトシーケンスのない文字セットは、解読するのがはるかに困難です。誤解しないでください、人間の言語サポートが重要な場合、ASCIIはそれを削減しません。しかし、基本的なプログラミングをしているだけで、コンパイラとオペレーティングシステムが書かれたネイティブ言語に自分自身を絞ることができるのであれば、なぜ複雑さを増すのでしょうか?@Donalフェロー。最後にチェックした... ASCII 7バイトです。(その余分なビットを持つものはすべてASCIIではなく、トラブルを求めています)
ebyrob 14

2
@ebyrob Donal Fellowsとは、各ASCIIシンボルがそれぞれ7ビットを使用しているため、8つのASCIIシンボルを7バイトにビットパッキングすることを意味すると思います... 8 * 7 = 56ビット= 7バイト。8個ごとに1バイトのストレージを節約するための特別なエンコードおよびデコード機能を意味します。
dodgy_coder

回答:


83

場合によっては、個々のキャラクターへのアクセスを高速化できます。str='ABC'UTF8およびASCIIでエンコードされた文字列を想像してください(そして、言語/コンパイラ/データベースがエンコードについて知っていると仮定します)

C多くのプログラミング言語で採用されている配列アクセス演算子を使用して、この文字列から3番目の文字()にアクセスするには、次のようにしc = str[2]ます。

これで、文字列がASCIIエンコードされている場合、必要なことは、文字列から3番目のバイトをフェッチすることだけです。

ただし、文字列がUTF-8でエンコードされている場合、最初の文字が1バイトまたは2バイトの文字であるかどうかを最初にチェックする必要があり、次に2番目の文字で同じチェックを実行する必要があり、その後のみ3番目の文字にアクセスできます。パフォーマンスの違いは、文字列が長くなるほど大きくなります。

これは、たとえば、UTF-8でエンコードされたVARCHARの「後」に配置された列の先頭を検索するデータベースエンジンでの問題です。データベースは、VARCHARフィールドに文字数だけでなく、それぞれが使用する多くのバイト。


3
データベースは、「文字カウント」の両方格納されていない場合、「バイト数」を、そして私はそれはいくつかの問題を持っていると言うだろう...
ディーン・ハーディング

1
TBHどちらも保存するデータベースはありません
...-Mchl

@Mchl:データベースが文字列の最後に達したとき、データベースがどのように知っていると思いますか?
ケビンクライン

1
通常、0x00または0x0000に達すると、
Mchl

4
@DeanHarding文字カウントは、2番目の文字の開始位置をどのように伝えますか?または、データベースは各文字オフセットのインデックスも保持する必要がありますか?注:2文字ではなく、最大4文字(6文字でない場合)stackoverflow.com/questions/9533258/…です。(あなたのシステムを破壊する可能性がある本当に長い憎悪を持っていたのはutf-16だけだと思います)
ebyrob 14

7

UTF-8のUS-ASCII(またはISO 646)サブセットのみを使用する場合、どちらにも実質的な利点はありません。実際、すべてが同じようにエンコードされます。

US-ASCII文字セットを超えて、(たとえば)典型的な西ヨーロッパ言語で使用されるアクセント、ウムラウトなどの文字を使用する場合、違いがあります。 ISO 8859では1バイトでエンコードされますが、UTF-8でエンコードされる場合は2バイト以上が必要になります。欠点は、もちろん、もあります:ISO 8859を使用すると、帯域外のいくつかを使用すると、使用されているエンコーディングを指定することを意味する必要があり、それが唯一のサポート1を一度にこれらの言語の。たとえば、キリル文字(ロシア語、ベラルーシ語など)のすべての文字を1バイトのみを使用してエンコードできますが、それらをフランス語またはスペイン語の文字(US-ASCII以外の文字と混合する必要がある場合) / ISO 646サブセット)かなり運が悪い-それを行うには文字セットを完全に変更する必要があります。

ISO 8859は、実際にはヨーロッパのアルファベットに対してのみ有用です。ほとんどの中国語、日本語、韓国語、アラビア語などのアルファベットで使用されるほとんどのアルファベットをサポートするには、まったく異なるエンコーディングを使用する必要があります。これらのいくつか(たとえば、日本語のシフトJIS)は、対処する絶対的な苦痛です。サポートする可能性があれば、万が一に備えてユニコードを使用する価値があると思います。


5

ANSIには多くのものがありますが、ほとんどの場合、この点で8ビット文字セットです(Windowsのコードページ1252など)。

おそらく、7ビットでUTF-8の適切なサブセットであるASCIIを考えていたのでしょう。つまり、有効なASCIIストリームも有効なUTF-8ストリームです。

8ビットの文字セットを考えている場合、1つの非常に重要な利点は、すべての表現可能な文字が正確に8ビットであるということです。UTF-8では最大24ビットです。


はい、私は7ビットASCIIセットについて話しています。utf-8ではなくasciiとして何かを保存する必要があるという1つの利点を考えることができますか?(とにかく7ビットが8ビットとして保存されるため、ファイルサイズはまったく同じになります)
-Pacerier

1
Unicode値127より大きい文字がある場合、ASCIIで保存できません。

1
@Pacerier:ASCII文字列はUTF-8文字列なので、違いはありません。使用するプラットフォームの文字列表現によっては、エンコードルーチン高速になる場合がありますが、柔軟性は大幅に低下しますが、大幅な高速化は期待できません。
back2dos

@Thorだからこそ、ASCIIで保存することには何の利点もないのかと尋ねるのです
-Pacerier

5
@ Pacerier、XMLをASCIIとして保存する場合は、 などを使用する必要があります。壊れないスペース用。これはより多くの情報を追加しますが、ISO-Latin-1とUTF-8のエンコードエラーに対するデータの耐性を高めます。これは、基盤となるプラットフォームがキャラクターに対して多くの目に見えない魔法をかけるために行うことです。ASCIIのままにしておくと、データがより堅牢になります。

3

はい、ASCIIが理にかなっているいくつかのユースケースがまだあります:ファイル形式ネットワークプロトコル。特に、次の用途で:

  • コンピュータープログラムによって生成および消費されるデータがあり、エンドユーザーに提示されることはありません。
  • しかし、開発とデバッグを容易にするために、プログラマーが読むことができると便利です。

エンコードとしてASCIIを使用することで、少なくともある程度の人間可読性を維持しながら、マルチバイトエンコードの複雑さを回避できます。

いくつかの例:

  • HTTPは、オクテットのシーケンスで定義されたネットワークプロトコルですが、「少なくとも」英語のプログラマーにとっては、「GET」、「POST」、「Accept-Language」などの単語のASCIIエンコーディングに対応していることが非常に便利ですなど。
  • PNG画像形式チャンクタイプは4オクテットで構成されますが、IDAT「画像データ」とPLTE「パレット」を意味するPNGエンコーダーまたはデコーダーをプログラミングする場合に便利です。

もちろん、データが実際にエンドユーザーに表示されないように注意する必要があります。なぜなら、データが表示されるようになった場合(URLの場合)、ユーザーはそのデータが正しく表示されることを当然期待するからです。彼らが読むことができる言語で。


よく言った。地球上で最もユニコードを送信するプロトコルであるHTTPがASCIIのみをサポートする必要があるのは少し皮肉なことです。(実は、私はそれはあなたがスタックのそのレベルで必要なすべてのです...同じはTCPとIP、バイナリサポート、ASCIIのサポートのために行くと仮定)
ebyrob

2

まず第一に:あなたのタイトルは/ d ANSIを使用していますが、テキストではASCIIを参照しています。ANSIはASCIIと等しくないことに注意してください。ANSIにはASCIIセットが組み込まれています。ただし、ASCIIセットは最初の128個の数値(0-127)に制限されています。

すべてのデータがASCII(7ビット)に制限されている場合、ANSIとUTF-8の両方が完全なASCIIセットを組み込むため、UTF-8、ANSI、またはASCIIのいずれを使用してもかまいません。つまり、0から127までの数値は、ASCII、ANSI、UTF-8のまったく同じ文字を表します。

ASCIIセット以外の文字が必要な場合は、エンコードを選択する必要があります。ANSIを使用することもできますが、すべての異なるコードページの問題に遭遇します。マシンAでファイルを作成し、マシンBで読むと、数値nnnがこれらのコードページの異なる文字を表すため、これらのマシンが異なるコードページを使用するように設定されている場合、おかしなテキストが生成される場合があります。

この「コードページの地獄」が、Unicode標準が定義された理由です。UTF-8はその標準の単一のエンコーディングにすぎませんが、さらに多くのエンコーディングがあります。UTF-16は、Windowsのネイティブエンコーディングであるため、最も広く使用されています。

したがって、ASCIIセットの128文字を超えるものをサポートする必要がある場合、UTF-8を使用することをお勧めします。この方法は重要ではなく、ユーザーがシステムをセットアップするコードページを心配する必要はありません。


128文字を超える文字をサポートする必要がない場合、UTF8エンコーディングよりもACSIIエンコーディングを選択する利点は何ですか?
Pacerier

これらの128文字に自分自身を制限する以外に?あまりない。UTF-8は、ANSIを「のみ」必要とするASCIIおよびほとんどの西洋言語に対応するように特別に設計されました。UTF-8は、比較的少数の上位ANSI文字のみを複数バイトでエンコードすることがわかります。HTMLページのほとんどがデフォルトとしてUTF-8を使用した理由は...ある
マージャンVenema氏

1
@ Pacerier、127を超えるエンコードが必要ない場合、エンコード/デコードにAPIを使用する場合はASCIIを選択する価値があるかもしれません検証なしで8ビットを読み取るだけの純粋なASCII。しかし、大規模(大規模)計算で高度な最適化が本当に必要で、その最適化で何をしているのかを知っている場合にのみ、ASCIIを使用することをお勧めします。そうでない場合は、UTF-8を使用します。
ルチアーノ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.