UTF16について質問です。
UTF8では1文字について符号単位の数がバラバラなため、文字数を数える時などは先頭から1文字ずつ
数えていく必要があります。
UTF16ではそもそも1符号単位で1文字を表すことを目的として作られたので、ほとんどの文字
は1符号単位(2バイト)で表されます。
つまり、文字数 = NULLまでのバイト数 / 2 というありがたいことに《なるはず》だったのです。
ところが、あとからやっぱり足りないということになって、サロゲートペアが導入されて面倒なことに
なりました。
U+10000..U+10FFFFの範囲の文字は1文字が2符号単位(4バイト)で表されることになったのです。
つまり、文字数を数えるときに先ほどの式が成り立たなくなり、一文字ずつサロゲートペアかを確かめて数えないと
いけなくなったのです。
とまあ、ここまでを調べました。間違っているところがあれば教えていただきたいです。
ここまでの書いたことが正しいとして、聞きたいことがあります。
「サロゲートペアはちゃんと考慮してやるべきなのでしょうか」
サロゲートペアさえ考えなければ、文字数も簡単に求まりますし、文字列操作も簡単にできます。
でも、サロゲートペアを考えると、1文字ごとにCharNextWでイテレートして文字列を数える、という
UTF8と同じようなことをしないといけません。これは格段に遅いですし、文字数カウントが遅くなれば
自然と文字列操作も遅くなります。
ほかの言語ではどうかというと、
C#(.NET)では、LengthメソッドはChar配列の大きさを返しますし、C++のwstringにおいてはただの文字
のコレクションなので、同じくサロゲートペアは考慮しません。
サロゲートペアを考慮するとなると、C#では、Globalization.StringInfo、C++では外部ライブラリを
使わない限りろくに文字列操作もできません。
一方、UTF8を使う言語も多く、そのような言語ではUTF8に対する文字列操作は標準で提供されています。
こう言った状況を鑑みるに、UTF16をデフォルトのエンコーディングとして採用する環境では、
(サロゲートペアを考慮するのはUTF8と同じくらいのコストなのに、)「正確な文字数」を
数える手段を提供していないように見受けられます。
非常に長々と書いてしまいましたが、結局
「UTF16を使う場合、速度が格段に遅くなる(といってもUTF8と同じくらい)としても、サロゲートペアは
ちゃんと考えてやるべきなのか」という質問です。
あまりHSPとは関係なく、ここで質問するのは不適切かもしれません。
それでも、教えてくれる方がいらっしゃるとありがたいです。