web-dev-qa-db-ja.com

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

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

UTF-8には、「ASCII文字」以外の文字サポートの利点があります。その場合、なぜeverを選択するのかASCII UTF-8でエンコードするのですか?

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

96
Pacerier

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

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

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

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

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

85
Mchl

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

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

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

7
Jerry Coffin

ANSIは多くのことを行うことができ、ほとんどがこの点で8ビット文字セットです(Windowsのコードページ1252など)。

おそらく、ASCII 7ビットであり、UTF-8の適切なサブセットです。つまり、有効なASCIIストリームも有効なUTF-8です。ストリーム。

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

5
user1249

はい、ASCIIが意味を持ついくつかの使用例があります:ファイル形式およびネットワークプロトコル。特に、次のような場合に使用します。

  • コンピュータープログラムによって生成および消費され、エンドユーザーには表示されないデータがあります。
  • しかし、これはプログラマーが読みやすく、開発とデバッグを容易にするのに役立ちます。

エンコーディングとしてASCIIを使用することで、マルチバイトエンコーディングの複雑さを回避しながら、少なくとも人間が読める形式を維持できます。

いくつかの例:

  • [〜#〜] http [〜#〜] は、オクテットのシーケンスに関して定義されたネットワークプロトコルですが、これらが(<英語を話すプログラマーにとっては)ASCII "GET"、 "POST"、 "Accept-Language"などの単語のエンコード。
  • PNG画像形式のチャンクタイプ は4つのオクテットで構成されますが、PNGエンコーダーまたはデコーダーをプログラミングしている場合は、IDATが「画像データ」を意味し、PLTEは「パレット」を意味します。

もちろん、データが実際に表示されないことがエンドユーザーに表示されないように注意する必要があります。 URLの場合)、ユーザーはデータが読み取り可能な言語であることを当然期待しています。

3
Gareth Rees

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

すべてのデータがASCII(7-bit)に制限されている場合、UTF-8、ANSI、ASCIIのどちらを使用しても問題はありません。ANSIとUTF-8の両方が完全な= ASCIIセット。言い換えると、0から127までの数値は、ASCII、ANSI、UTF-8でまったく同じ文字を表します。

ASCIIセット以外の文字が必要な場合は、エンコーディングを選択する必要があります。ANSIを使用することもできますが、さまざまなコードページの問題が発生します。ファイルを作成してくださいマシンAで読み取り、マシンBで読み取ると、これらのマシンが異なるコードページを使用するように設定されている場合、数値nnnがこれらのコードページの異なる文字を表すため、単純に面白いテキストが生成される可能性があります。

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

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

2
Marjan Venema