ワイド文字は 、一般に従来の8 ビット文字よりも大きいサイズを持つコンピュータ文字 データ型です。データ型のサイズが大きくなると、より大きなコード化文字セットを使用できるようになります。
歴史
1960 年代、メインフレームとミニコンピュータのメーカーは、最小のデータ型として8 ビットバイトを標準化し始めました。7 ビットのASCII文字セットは、テレタイプ マシンとコンピュータ端末の英数字をエンコードする業界標準の方法になりました。余分なビットはパリティに使用され、データの保存と転送の整合性が確保されました。その結果、8 ビット バイトは、メモリに ASCII 文字を保存するコンピュータ システムの事実上のデータ型になりました。
その後、コンピュータ製造業者は、ASCII 文字セットを英語のアルファベット文字の限られたセットを超えて拡張するために、予備ビットを利用し始めました。IBMコード ページ 37、 PETSCII、ISO 8859などの8 ビット拡張が一般的になり、ギリシャ文字、キリル文字、その他多くの文字の端末サポートが提供されました。ただし、このような拡張は地域固有であり、同時に使用できないことが多かったという点で依然として制限がありました。1 つの文字セットから別の文字セットに変換するには、特別な変換ルーチンを使用する必要があり、ターゲット セットに同等の文字が存在しない場合は破壊的な変換になることがよくありました。
1989 年、国際標準化機構は、 16 ビット (2 バイト) または 32 ビット (4 バイト) の値を使用してエンコードできる多言語文字セットであるユニバーサル文字セット(UCS)の作業を開始しました。これらの大きな値では、新しい文字値をメモリに格納するために 8 ビットを超えるデータ型を使用する必要がありました。そのため、従来の 8 ビット文字データ型と区別するために、ワイド文字という用語が使用されました。
UCSとUnicodeとの関係
ワイド文字は、メモリ内のデータ型のサイズを指します。文字セット内の各値がどのように定義されているかは示しません。代わりに、これらの値は文字セットを使用して定義されます。UCS とUnicodeは、8 ビット幅の数値 (合計 255) で許可されるよりも多くの文字をエンコードする 2 つの一般的な文字セットです。
マルチバイト文字との関係
以前のデータ伝送システムが8 ビットのクリーンなデータ パスの欠如に悩まされていたのと同様に、現代の伝送システムでは、文字データ用の 16 ビットまたは 32 ビットのデータ パスがサポートされていないことがよくあります。このため、 UTF-8などの文字エンコード システムでは、1 つの 8 ビット シンボルでは大きすぎる値を 複数のバイトを使用してエンコードできます。
C標準では、各文字を表すために固定または可変のバイト数を使用する文字のマルチバイト エンコーディング (主にソース コードと外部ファイルで使用) と、単一オブジェクト内の文字の実行時表現であるワイド文字(通常は 8 ビット以上) を区別します。
ワイド文字のサイズ
UCS-2 (「Unicode 1.0」)の早期採用により、多くのプラットフォーム、特にMicrosoft Windows、.NET、JavaでUTF-16が一般的に使用されるようになりました。これらのシステムでは、 16 ビットの「ワイド文字」( C/C++ の場合、 Java の場合) 型が一般的です。これらの型は、必ずしも 1 つの「文字」に直接マップされるわけではありません。これは、 Unicode の全範囲を格納するためにサロゲート ペアが必要になるためです (1996、Unicode 2.0)。 [1] [2] [3]wchar_tchar
Unix系では、wchar_t C90で規定されているように、21ビットのUnicodeコードポイントに合わせて32ビットを使用するのが一般的です。 [4]
ワイド文字型のサイズは、変換が利用できるため、システムが処理できるテキストエンコーディングの種類を決定しません。(ただし、古い変換コードでは、サロゲートが無視されることがよくあります。) 採用の歴史的状況によっても、どのタイプのエンコーディングが優先されるかが決まります。Windows などの Unicode 1.0 の影響を受けたシステムは、主にワイド文字単位で作成された「ワイド文字列」を使用する傾向があります。ただし、Unix のような他のシステムは、8 ビットの「ナロー文字列」規則を維持し、マルチバイトエンコーディング (ほぼ普遍的に UTF-8) を使用して「ワイド」文字を処理する傾向があります。[5]
プログラミングの詳細
C++ の
CおよびC++の標準ライブラリには、ワイド文字とそれで構成される文字列を扱うための機能が多数含まれています。ワイド文字はデータ型を使用して定義され、元のC90標準では次のように定義されていました。
wchar_t
- 「サポートされているロケールで指定された最大の拡張文字セットのすべてのメンバーの異なるコードを値の範囲で表すことができる整数型」(ISO 9899:1990 §4.1.5)
C とC++ はどちらも固定サイズの文字型を導入しchar16_t、char32_tそれぞれの標準の 2011 年改訂版で 16 ビットおよび 32 ビットのUnicode変換形式の明確な表現を提供し、wchar_t実装定義のままにしています。ISO/IEC 10646:2003 Unicode標準 4.0 では、次のように述べられています。
- 「の幅は
wchar_tコンパイラ固有であり、8ビットほど小さくなることがあります。したがって、CまたはC++コンパイラ間で移植性が必要なプログラムでは、wchar_tUnicodeテキストの格納に使用しないでください。この型は、コンパイラ定義のワイド文字を格納するためのもので、一部のコンパイラではUnicodewchar_t文字になる場合があります。」[6]
パイソン
Python 2.7 のドキュメントによると、この言語ではwchar_t文字型 のベースとして が使用されることPy_UNICODEがあります。これは、がwchar_tそのシステムで「選択された Python Unicode ビルドバリアントと互換性がある」かどうかによって異なります。[7]この区別は Python 3.3 以降は非推奨です。Python 3.3 では、文字列用に柔軟なサイズの UCS1/2/4 ストレージが導入され、正式に に別名が付けられPy_UNICODEましたwchar_t。[8] Python 3.12 以降、Python 文字列 (実装では wstr) 用のwchar_t、つまりPy_UNICODE typedefの使用は廃止されましたが、以前と同様に「UTF-8表現はオンデマンドで作成され、Unicode オブジェクトにキャッシュされます。」[9]
参考文献
- ^ 「Globalization Step-by-Step: Unicode Enabled」。msdn.microsoft.com。2009年1月1日時点のオリジナルよりアーカイブ。
- ^ 「String クラス (System)」。learn.microsoft.com。
- ^ 「プリミティブ データ型 (Java™ チュートリアル > Java 言語の学習 > 言語の基礎)」。docs.oracle.com。
- ^ 「Null 終端ワイド文字列 <wctype.h> - cppreference.com」。en.cppreference.com。
- ^ 「UTF-8 Everywhere」。
その後数年間で、多くのシステムが Unicode のサポートを追加し、UCS-2 エンコーディングに切り替えました。これは、Qt フレームワーク (1992)、Windows NT 3.1 (1993)、Java (1995) などの新しいテクノロジにとって特に魅力的でした。
- ^ 「5.2 ANSI/ISO C wchar_t」。Unicode 標準。Aliprand, Joan、Unicode コンソーシアム。(バージョン 4.0 版)。ボストン: Addison-Wesley。2003 年。109 ページ。ISBN 0-321-18578-1. OCLC 52257637。
{{cite book}}: CS1 メンテナンス: その他 (リンク) - ^ 「Unicode オブジェクトとコーデック — Python 2.7 ドキュメント」。docs.python.org。2009年12 月 19 日閲覧。
- ^ 「Unicode オブジェクトとコーデック — Python 3.10.10 ドキュメント」。docs.python.org。2023年2 月 18 日閲覧。
- ^ 「Unicode オブジェクトとコーデック」。Pythonドキュメント。2023年9 月 9 日閲覧。
外部リンク
- Unicode 標準バージョン 4.0 - オンライン版
- C ワイド文字関数 @ Java2S
- Java Unicode 関数 @ Java2S
- マルチバイト (3) マニュアルページ @ FreeBSD.org
- マルチバイト文字とワイド文字 @ Microsoft Developer Network
- Windows 文字セット @ Microsoft Developer Network
- Unicode および文字セット プログラミング リファレンス @ Microsoft Developer Network
- マルチバイト文字のサポートをシンプルに保つ @ EuroBSDCon、ベオグラード、2016 年 9 月 25 日
