ASCIIのすべての文字は、ストレージを増やすことなくUTF-8を使用してエンコードできます(どちらも1バイトのストレージが必要です)。
UTF-8には、「ASCII文字」以外の文字サポートという追加の利点があります。その場合、なぜUTF-8ではなくASCIIエンコーディングを選択するのでしょうか。
UTF-8ではなくASCIIを選択する場合のユースケースはありますか?
コメント
- レガシーなものをサポートするために…
- つまりUTF8は合法的に ASCIIもサポートしているので、レガシーのものをサポートする必要がある場合でも、UTF8は他の変更を必要とせずに問題なく動作します。
- 多分’と相互運用する必要があります8つのASCII文字を7バイトにパックするシステム?人々は物事に合うようにクレイジーなことをしました。
- 私をナッツと呼んでください、しかし私は’ dはセキュリティと安定性を言います。マルチバイトシーケンスのない文字セットは壊すのがはるかに難しいです。人間の言語サポートが重要な場合、誤解しないでくださいASCIIが勝ちます’ div id = “c7158ce818”>
tカットします。ただし、’基本的なプログラミングを行っているだけで、コンパイラと操作をネイティブ言語に絞ることができる場合gシステムはのために書かれました、なぜ複雑さを加えるのですか? @Donalフェロー。最後に確認しました… ASCIIは7バイトです。 (その余分なビットを持つものはすべてASCIIではなく’ t ASCIIであり、問題を求めています)
回答
場合によっては、個々のキャラクターへのアクセスを高速化できます。 UTF8およびASCIIでエンコードされた文字列str="ABC"
を想像してください(言語/コンパイラ/データベースがエンコードについて知っていると仮定します)
3番目にアクセスするには(C
)多くのプログラミング言語で機能するarray-access演算子を使用したこの文字列の文字は、c = str[2]
のようになります。
、文字列がASCIIエンコードされている場合、必要なのは文字列から3番目のバイトをフェッチすることだけです。
ただし、文字列がUTF-8でエンコードされている場合は、最初に最初の文字が1バイトまたは2バイトの文字かどうかを確認し、次に2番目の文字に対して同じチェックを実行する必要があります。そうしないと、にアクセスできなくなります。 3番目の文字。パフォーマンスの違いは大きくなり、文字列が長くなります。
これは、たとえば一部のデータベースエンジンで、UTF-8でエンコードされたVARCHARの「後に」配置された列の先頭を見つける際の問題です。 、データベースは、VARCHARフィールドにある文字数だけでなく、各文字が使用するバイト数もチェックする必要があります。
コメント
- データベースが’両方の”文字数を保存しない場合” および “バイト数”、次に’ ‘いくつかの問題が発生しました…
- TBHどちらも格納するデータベースがないことを知っています…
- @Mchl:どのようにデータベースが文字列の終わりに到達したことを知っていると思いますか?
- 通常は0x00または0x0000に到達します
- @DeanHarding文字数は、2番目の文字がどこから始まるかをどのように示しますか?または、データベースは各文字オフセットのインデックスも保持する必要がありますか?注:’は2文字だけではありませんが、最大4文字になる可能性があります(’ s 6の場合を除く) stackoverflow.com/questions/9533258/ … 。 (’システムを破壊する可能性のある非常に長い嫌悪感を持っていたのはutf-16だけだと思います)
回答
UTF-8のUS-ASCII(またはISO 646)サブセットのみを使用する場合、どちらにも実質的な利点はありません。実際、すべてが同じようにエンコードされます。
US-ASCII文字セットを超えて、(たとえば)通常で使用されるアクセントやウムラウトなどの文字を使用する場合西ヨーロッパの言語では、違いがあります。これらのほとんどは、ISO 8859では1バイトでエンコードできますが、UTF-8でエンコードする場合は2バイト以上が必要になります。もちろん、欠点もあります。ISO8859では、使用するエンコーディングを指定するために帯域外手段を使用する必要があり、一度にサポートされるのはこれらの言語の1つだけです。 たとえば、キリル文字のすべての文字(ロシア語、ベラルーシ語など)をエンコードできます。)1バイトを1バイトだけ使用するアルファベットですが、それらをフランス語またはスペイン語の文字(US-ASCII / ISO 646サブセット以外)と混合する必要がある場合は、「運が悪いです。完全に行う必要があります。これを行うには、文字セットを変更します。
ISO 8859は、実際にはヨーロッパのアルファベットにのみ役立ちます。ほとんどの中国語、日本語、韓国語、アラビア語などで使用されるほとんどのアルファベットをサポートするには、を使用する必要があります。いくつかの完全に異なるエンコーディング。これらのいくつか(たとえば、日本語のShift JIS)は、対処するのに絶対的な苦痛です。それらをサポートしたいと思う可能性がある場合は、Unicodeを使用する価値があると思います。ケース。
回答
ANSIにはさまざまなものがありますが、そのほとんどはこの点で8ビットの文字セットです(コードページ1252のように) Windows)。
おそらく、7ビットでUTF-8の適切なサブセットであるASCIIについて考えていたのでしょう。つまり有効なASCIIストリームはすべて有効なUTF-8ストリームでもあります。
8ビット文字セットを考えている場合、非常に重要な利点の1つは、表現可能なすべての文字が正確に8ビットであるということです。UTFでは-8最大24ビットにすることができます。
コメント
- はい’について話します7ビットASCIIセット。 utf-8ではなくasciiとして何かを保存する必要がある1つの利点を考えられますか? (とにかく7ビットは8ビットとして保存されるため、ファイルサイズはまったく同じになります)
- Unicode値127より大きい文字がある場合、ASCIIで保存することはできません。
- @Pacerier:すべてのASCII文字列はUTF-8文字列であるため、違いはありません。使用するプラットフォームの文字列表現によっては、エンコードルーチンが高速になる可能性があります。ただし、大幅な速度低下は期待できませんが、大幅な損失が発生します。’柔軟性があります。
- @Thorだからこそ、i ‘ ASCIIとして保存することに利点があるかどうかを尋ねています
- @Pacerier、 XMLをASCIIとして保存する場合は、たとえばを使用する必要があります。  壊れないスペースのために。これはより充実していますが、ISO-Latin-1とUTF-8のエンコードエラーに対するデータの耐性が高まります。これは、基盤となるプラットフォームがキャラクターに対して多くの目に見えない魔法を実行するときに行うことです。 ASCIIを使用すると、データがより堅牢になります。
回答
はい、ASCIIを使用するユースケースはまだいくつかあります。理にかなっている:ファイル形式とネットワークプロトコル。特に、次のような用途に使用します。
- コンピュータプログラムによって生成および消費され、エンドユーザーに提示されることのないデータがあります。
- ただし、このデータは次の場合に役立ちます。開発とデバッグを容易にするために、プログラマーが読むことができるようにします。
エンコードとしてASCIIを使用することにより、少なくともある程度の人間の読みやすさを維持しながら、マルチバイトエンコードの複雑さを回避します。
いくつかの例:
- HTTP は、オクテットのシーケンスで定義されたネットワークプロトコルです。しかし、これらが「GET」、「POST」、「Accept-Language」などの単語のASCIIエンコーディングに対応していることは(少なくとも英語を話すプログラマーにとっては)非常に便利です。
- PNG画像形式のチャンクタイプは4つのオクテットで構成されていますが、は「画像データ」を意味し、
PLTE
は「パレット」を意味します。
もちろん必要ですデータが実際にエンドユーザーに表示されないように注意してください(URLの場合のように)データが表示されてしまうと、ユーザーは当然そのデータを期待することになります。読むことができる言語であるため。
コメント
- よく言われます。 ‘少し皮肉なことに、地球上で最も多くのUnicodeを送信するプロトコルであるHTTPはASCIIのみをサポートする必要があります。 (実際には、TCPとIP、バイナリサポート、ASCIIサポートにも同じことが当てはまると思います… ‘スタックのそのレベルで必要なものはすべてです)
回答
まず、タイトルは/ d ANSIを使用しますが、テキストではASCIIを参照します。 ANSIはASCIIと等しくないことに注意してください。 ANSIにはASCIIセットが組み込まれています。ただし、ASCIIセットは最初の128個の数値(0〜127)に制限されています。
すべてのデータがASCII(7ビット)に制限されている場合は、UTF-8を使用するかどうかは関係ありません。 、ANSIまたはASCII。ANSIとUTF-8の両方に完全なASCIIセットが組み込まれています。つまり、0から127までの数値は、ASCII、ANSI、およびUTF-8でまったく同じ文字を表します。
ASCIIセット以外の文字が必要な場合は、エンコーディングを選択する必要があります。 ANSIを使用することもできますが、その後、すべての異なるコードページの問題が発生します。マシンAでファイルを作成し、マシンBでそれを読み取ると、これらのマシンが異なるコードページを使用するように設定されている場合、変な外観のテキストが生成される可能性があります。 >この「コードページ地獄」が、 Unicode標準が定義された理由です。 UTF-8は、その標準の単一のエンコーディングにすぎず、さらに多くのエンコーディングがあります。 UTF-16は、Windowsのネイティブエンコーディングであるため、最も広く使用されています。
したがって、ASCIIセットの128文字を超えるものをサポートする必要がある場合は、
UTF-8 。そうすれば、それは問題ではなく、ユーザーがシステムをセットアップしたコードページについて心配する必要はありません。
コメント
- 128文字を超える文字をサポートする必要がない場合、UTF8エンコーディングよりもACSIIエンコーディングを選択する利点は何ですか?
- 128文字に制限する以外に?あまりない。 UTF-8は、”のみ”がANSIを必要とするASCIIおよびほとんどの西洋言語に対応するように特別に設計されました。 UTF-8は、1バイトを超える比較的少数の上位ANSI文字のみをエンコードすることがわかります。ほとんどのHTMLページがデフォルトとしてUTF-8を使用するのには理由があります…
- @Pacerier、’ 127を超えるエンコードが必要ない場合は、 APIを使用してエンコード/デコードする場合はASCIIを選択する価値があります。これは、UTFが追加のバイトを同じ文字と見なすために追加のビット検証が必要なため、検証なしで8ビットを読み取る純粋なASCIIではなく、追加の計算が必要になる場合があります。ただし、大規模(大規模)計算で高レベルの最適化が本当に必要であり、その最適化で’何をしているのかがわかっている場合にのみ、ASCIIを使用することをお勧めします。そうでない場合は、UTF-8を使用してください。