新しいものを表示

ちょっと古いけどいろんな言語環境の書記素クラスタカウントの例の記事見つけた><

2015-03-19
文字数をカウントする7つの方法
engineering.linecorp.com/ja/bl

とりあえずSwiftが一番えらいっぽい><

pͪoͣnͬpͣoͥnͭpͣa͡inͥ の文字数カウント(書記素クラスタカウント)出来る出来ないって、結構おもしろい問題っぽさ><

Swiftはちゃんと最初から文字数を返してくれるっぽい・・・?><(paiza ioで試したら実際そうなった><)
この記事の筆者はそれを嫌がってるけど><;

【pͪoͣnͬpͣoͥnͭpͣa͡inͥもあるよ】Swiftの文字数カウントがKotlinとRubyに対して差が出た話
zenn.dev/stadium/articles/swif

Goも標準ライブラリでは文字数カウントできないっぽい・・・?><

で、いろいろググってわかったけど、少なくとも日本語で書かれてる各環境での文字列の文字数カウントの解説記事、ほとんどが文字数じゃなくて文字列型の内部要素数相当を得るだけのを文字数カウントとして紹介してる><

Rustの場合は
let text = "pͪoͣnͬpͣoͥnͭpͣa͡inͥ";
let count = text.graphemes(true).count();

で、10が返ってくるっぽい><

Pythonの場合は外部のライブラリに頼らないと厳密な文字数カウントはできないらしい・・・><(いろいろ試してできなくてCopilotさんに聞いた><)

よくわかんないけど、結論としては、Rubyで文字数をカウントしたいのであれば、UTF-8のstringにした上でgrapheme_clusters.sizeを使えって事っぽい・・・?><

C# の場合は、StringInfo.LengthInTextElementsを使えばおk><

s="pͪoͣnͬpͣoͥnͭpͣa͡inͥ"
s.encode("UTF-16").grapheme_clusters.size;
→40

????????><;

s="pͪoͣnͬpͣoͥnͭpͣa͡inͥ"
s.encode("UTF-8").grapheme_clusters.size;
→10

参考文献><;
Ruby で文字数を数える - Qiita
qiita.com/Nabetani/items/93e9a

Ruby

s="pͪoͣnͬpͣoͥnͭpͣa͡inͥ"
s.encode("UTF-8").size;
→19
s.encode("UTF-16").size;
→40

どういうことなの・・・?><;

haraita-i部分はオマケ(?)であって独立した文字じゃないのか・・・><

C# で、pͪoͣnͬpͣoͥnͭpͣa͡inͥ で試したら、
String.Length
19

StringInfo.LengthInTextElements
10

UTF8.GetBytes().Length
28

になった><

C# は常にstringがUTF-16なのでそういう混乱起きなそう><
System.Console.WriteLine("𠮷野家".Length);
UTF-16のCharの数なので「4」

System.Console.WriteLine(new System.Globalization.StringInfo("𠮷野家").LengthInTextElements);
TextElementの数は「3」
System.Console.WriteLine(Encoding.UTF8.GetBytes("𠮷野家").Length);
UTF-8のバイト列の長さでは「10」

orange さんがブースト

C# の場合どうなんだろうと思って調べてみたら、text elementsって表現してた><

StringInfo.LengthInTextElements Property (System.Globalization) | Microsoft Learn learn.microsoft.com/en-us/dotn

"The number of base characters, surrogate pairs, and combining character sequences in this StringInfo object."

orange さんがブースト

にしても UTF-n の # of code unit を「文字数」と表現するのは典型的な良くない表現では……

スレッドを表示
古いものを表示
:realtek:

思考の /dev/null