ユニコードはコンピュータ上でのテキスト表現の世界標準です。 Dは言語仕様と標準ライブラリの両方でユニコードに完全対応しています。
コンピュータは、最も低レベルのところでは数値しか扱わないため、テキストとは何かという 概念を持ちません。結果、コンピュータコードはテキストデータをとり、それをバイナリ表現 との間で変換する方法を必要とします。変換の方法を符号化方式といい、 ユニコードはそのような方式のひとつです。
例の文字列の根本にある数値表現を見ると、単にコードを実行しています。
ユニコードは世界のすべての言語を同じ符号化方式を使い表現することを可能にする そのデザインにおいて独特です。ユニコード以前は、コンピュータは異なる会社によって製造されたり コミュニケーションに苦労する異なる地域で出荷されたりしており、場合によっては符号化方式が 全くサポートされないこともあり、そのコンピュータでテキストを表示することは不可能でした。
ユニコードとその技術的詳細についてのさらなる情報については、「掘り下げる」セクションの ウィキペディアのユニコードの記事を確認してください。
ユニコードはこれらの問題のほとんどを修正し、あらゆるモダンなマシンでサポートされています。 Dは古い言語の過ちから学び、Dのそのような文字列すべてはユニコード文字列であるのに対して、 CやC++のような言語では文字列はただのバイトの配列です。
Dではstring
、wstring
、dstring
はそれぞれUTF-8、UTF-16、UTF-32でエンコードされた
文字列です。これらの文字型はchar
、wchar
、dchar
です。
仕様によると、Dの文字列型にユニコードでないデータを格納するとエラーになります。 文字列が不適切にエンコードされた場合プログラムは異なる方法で失敗することを期待します。
文字列エンコーディングを格納するため、またはC・C++の挙動を得るために、ubyte[]
かchar*
が使えます。
このセクションのために [レンジアルゴリズム](gems/range-algorithms) を読むことを推奨します
Dのユニコードにおいていくつか念頭に置いておく重要な注意事項があります。
まず、便利な機能として、レンジ関数を使って文字列を反復処理するとき、
Phobosはstring
とwstrings
の全要素をUTF-32コードポイントにエンコードします。
オートデコーディングとして知られるこの方法は、このようなことを意味します
static assert(is(typeof(utf8.front) == dchar));
この振る舞いは多くのことを示唆し、多くの人を混乱させる主なものとしては、
std.traits.hasLength!(string)
がFalse
になります。なぜ?レンジAPIの観点からいうと、
string
のlength
はレンジ関数が反復処理をする要素の数ではなく文字列内の要素の数を返すためです。
例から、なぜこれら2つのものが常に等しいとは限らないかを見ることができます。
したがって、Phobosのレンジアルゴリズムはstring
が長さの情報を持たないかのように振る舞います。
オートデコーディングの技術的詳細、そしてそれがあなたのプログラムにとって持つ意味についての さらなる情報については、「掘り下げる」セクションのリンクを確認してください。