sakura-editor / management-forum

管理・運用向けフォーラム(Issues をフォーラム代わりに使う)
2 stars 0 forks source link

問題。この文字列は何文字? #68

Open berryzplus opened 5 years ago

berryzplus commented 5 years ago

問1.

test (英語)

問2.

テスト (日本語)

問3.

Schrödingers Katze (シュレディンガーの猫、ドイツ語表記)

問4.

ネ申 (2ちゃん語)

ds14050 commented 5 years ago

「この文字列」がどの文字列か曖昧さがありますが、背景色が異なる文字列を選択してブラウザコンソールで getSelection().toString().length を実行しました。結果は順に 4, 3, 19, 2 でした。同意できる数字です。

結合文字や異体字セレクタが混じると意見が変わるでしょうし、問3で空白(文字)をカウントしたことにすでに異論があるかもしれません。「文字」という概念を「文字コード」から切り離して考えるなら、空白を何分割してカウントすることも可能ですから、「半角空白が3文字」という数え方は「文字」の数え方とは異なります。

以上、真意が不明なために面倒くさくなってしまった答えでした。

berryzplus commented 5 years ago

以上、真意が不明なために面倒くさくなってしまった答えでした。

あざっす。真意が伝わりそうな方向に引っかかっていただき、感謝です。 これは、Unicodeの結合文字の概念を理解するためのデモンストレーションです。

ぼくが思う回答は、もうちょっと様子を見てから書きます。 (一応、サクラエディタ機能追加提案の前振りのつもりで立てたissueです。)

berryzplus commented 5 years ago

回答

No 文字列 byte数(UTF-8) コードポイント数 文字数
問1. test 4 4 4
問2. テスト 9 3 3
問3. Schrödingers Katze 20 19 17
問4. ネ申 6 2 1

コンピュータ内部の文字列がどのように描画されるか、また、描画された文字列をどのように認識されるか、というのは文化によって異なると思います。

すでに書いてますが問3がポイントで、この文字列はドイツ語の結合文字(ö)を含んでいます。 これは(o)と( ̈)の2つのコードポイントで構成されていますが、人の目には1字に見えます。 「何文字ですか?」に対して空白を1字にカウントするのは変だと思うので回答は17になります。

文字の認識方法は文化によって変わる、これを示すために作ったのが問4です。 「神」という字は「ころもへん(ネ)」に「申す」と書きます。 「ネ申」を「神」とよめるのは2ちゃんが横書きの文化だからだと思います。

WinNLS (Windows の National Language Support) では主要な国・地域・言語における文化の違いがすでに実装されています。ちゃんと使えば結合文字(ö)を1字とカウントさせることができます。 (「ネ申」は無理です。

この辺(↓)の表記の違いも、正しく表示できたらいいなぁ、とか思ったり思わなかったり。