web-dev-qa-db-ja.com

マルチバイト文字セットとは何ですか?

マルチバイトという用語は、文字が1バイトよりも広い(ただし、そうである必要はない)文字セット(UTF-8など)を指すのか、それとも1バイトよりも広い文字セット(UTFなど)を指すのか-16)?言い換えれば、誰かがマルチバイト文字セットについて話す場合、どういう意味ですか?

32
prinzdezibel

この用語はあいまいですが、私の国際化作業では、通常、「マルチバイト文字セット」という用語はUnicodeベースのエンコードを指すのを避けました。通常、この用語は、各文字を定義するために1バイト以上のレガシーエンコーディングスキームにのみ使用しました(1文字につき1バイトのみを必要とするエンコーディングを除く)。

通常、Shift-jis、jis、euc-jp、euc-kr、および中国語エンコーディングが含まれます。

いくつかの例外を除いて、レガシーエンコーディングのほとんどは、処理するために一種のステートマシンモデル(または、より単純に、ページスワッピングモデル)を必要とし、テキストストリームの後方への移動は複雑でエラーが発生しやすくなります。 UTF-8はビットマスクでテストでき、UTF-16は一連のサロゲートペアに対してテストできるため、UTF-8およびUTF-16はこの問題の影響を受けません。それほど複雑にならずに安全に行われます。

タイ語やベトナム語などの言語用のいくつかのレガシーエンコーディングは、マルチバイト文字セットの複雑さをある程度備えていますが、実際には文字の組み合わせに基づいて構築されており、一般に「マルチバイト」という広義の用語にまとめられていません。

31
JasonTrue

誰かがマルチバイト文字セットについて話す場合、どういう意味ですか?

それは、いつものように、誰が話しているかにかかっています!

論理的には、UTF-8、Shift-JIS、GBなど、可変長エンコードを含める必要があります。 UTF-16は、このグループでは考慮されないことがよくあります(サロゲートの種類が何であっても、UTF-16LE/UTF-16BEを介してバイトにエンコードされた場合、確かに複数バイトです)。

しかし、Microsoftlandでは、この用語は通常、可変長のデフォルトシステムコードページを意味するために使用されます(残念ながらまだたくさんあるレガシー非Unicodeアプリケーションの場合)。この使用法では、UTF-8およびUTF-16LE/UTF-16BEを含めることはできません。これは、Windowsのシステムコードページをこれらのエンコーディングのいずれにも設定できないためです。

実際、場合によっては、「mbcs」はシステムコードページの同義語にすぎず、それ以外の場合は(さらに誤解を招くように)「ANSI」としても知られています。この場合、「マルチバイト」文字セットは、実際には1文字につき1バイトしか使用しないcp1252西ヨーロッパのように些細なものです。

私のアドバイス:それを意味するときは「可変長」を使用し、「マルチバイト」というあいまいな用語を避けてください。他の誰かがそれを使用する場合、説明を求める必要がありますが、通常、Windowsのバックグラウンドを持つ人は、UTFではなくcp932(Shift-JIS)などのレガシー東アジアのコードページについて話します。

16
bobince

1バイト= 1文字のマッピングを持たないすべての文字セット。すべてのUnicodeバリアント、およびアジアの文字セットもマルチバイトです。

詳細については、 このウィキペディアの記事 を読むことをお勧めします。

6
Lucero

マルチバイト文字とは、エンコードに1バイト以上が必要な文字を意味します。ただし、これは、その特定のエンコードを使用するすべての文字が同じ幅(バイト単位)を持つことを意味するものではありません。例:UTF-8およびUTF-16エンコード文字は複数バイトを使用する場合がありますが、allUTF-32エンコード文字 always32ビットを使用します。

参照:

4
dirkgently

通常、前者、つまりUTF-8に似ています。詳細については、 可変幅エンコーディング を参照してください。

2

前者-ただし、「可変長エンコーディング」という用語の方が適切です。

2

私は通常、canが文字ごとに複数のバイトを持っている文字を参照するために使用します。

2
Bert Lamb

マルチバイト文字セットは、1バイト文字と2バイト文字の両方で構成されます。したがって、マルチバイト文字列には、シングルバイト文字とダブルバイト文字が混在する場合があります。

参照: シングルバイトおよびマルチバイト文字セット

1
navigaid

UTF-8はマルチバイトです。つまり、各英語文字(ASCII)は1バイトに格納され、中国語、タイ語などの非英語文字は3バイトに格納されます。 「ทt」のように中国語/タイ語を英語と混ぜると、最初のタイ語文字「ท」は3バイトを使用し、2番目の英語文字「t」は1バイトのみを使用します。マルチバイトエンコーディングを設計した人々は、英語の文字を3バイトで保存すべきではなく、ストレージスペースの無駄のために1バイトに収めることができることに気付きました。

UTF-16は、英語または英語以外の各文字を2バイトの固定長で保存するため、マルチバイトではなくワイド文字と呼ばれます。各文字が完全に2バイトに収まる中国語/タイ語に非常に適していますが、utf-8コンソール出力への印刷には、wcstombs()関数を使用してワイド文字からマルチバイト形式に変換する必要があります。

UTF-32は各文字を4バイトの固定長で保存しますが、保存スペースの無駄のために文字を保存するために誰も使用しません。

1
Ray Chakrit