Dにおけるユニコード

ユニコードはコンピュータ上でのテキスト表現の世界標準です。 Dは言語仕様と標準ライブラリの両方でユニコードに完全対応しています。

何を、どうして

コンピュータは、最も低レベルのところでは数値しか扱わないため、テキストとは何かという 概念を持ちません。結果、コンピュータコードはテキストデータをとり、それをバイナリ表現 との間で変換する方法を必要とします。変換の方法を符号化方式といい、 ユニコードはそのような方式のひとつです。

例の文字列の根本にある数値表現を見ると、単にコードを実行しています。

ユニコードは世界のすべての言語を同じ符号化方式を使い表現することを可能にする そのデザインにおいて独特です。ユニコード以前は、コンピュータは異なる会社によって製造されたり コミュニケーションに苦労する異なる地域で出荷されたりしており、場合によっては符号化方式が 全くサポートされないこともあり、そのコンピュータでテキストを表示することは不可能でした。

ユニコードとその技術的詳細についてのさらなる情報については、「掘り下げる」セクションの ウィキペディアのユニコードの記事を確認してください。

どうやって

ユニコードはこれらの問題のほとんどを修正し、あらゆるモダンなマシンでサポートされています。 Dは古い言語の過ちから学び、Dのそのような文字列すべてはユニコード文字列であるのに対して、 CやC++のような言語では文字列はただのバイトの配列です。

DではstringwstringdstringはそれぞれUTF-8、UTF-16、UTF-32でエンコードされた 文字列です。これらの文字型はcharwchardcharです。

仕様によると、Dの文字列型にユニコードでないデータを格納するとエラーになります。 文字列が不適切にエンコードされた場合プログラムは異なる方法で失敗することを期待します。

文字列エンコーディングを格納するため、またはC・C++の挙動を得るために、ubyte[]char*が使えます。

レンジアルゴリズムでの文字列

このセクションのために [レンジアルゴリズム](gems/range-algorithms) を読むことを推奨します

Dのユニコードにおいていくつか念頭に置いておく重要な注意事項があります。

まず、便利な機能として、レンジ関数を使って文字列を反復処理するとき、 Phobosはstringwstringsの全要素をUTF-32コードポイントにエンコードします。 オートデコーディングとして知られるこの方法は、このようなことを意味します

static assert(is(typeof(utf8.front) == dchar));

この振る舞いは多くのことを示唆し、多くの人を混乱させる主なものとしては、 std.traits.hasLength!(string)Falseになります。なぜ?レンジAPIの観点からいうと、 stringlengthレンジ関数が反復処理をする要素の数ではなく文字列内の要素の数を返すためです。

例から、なぜこれら2つのものが常に等しいとは限らないかを見ることができます。 したがって、Phobosのレンジアルゴリズムはstringが長さの情報を持たないかのように振る舞います。

オートデコーディングの技術的詳細、そしてそれがあなたのプログラムにとって持つ意味についての さらなる情報については、「掘り下げる」セクションのリンクを確認してください。

掘り下げる

rdmd playground.d