@marcie001の技術ブログ

C++標準化委員会、ついに文字とは何かを理解する: char8_t を読んでいて、コードポイントと見た目の1文字が違うことを知った。個人的によく使う言語ではどうやって数えるのか調べた。

Java

com.ibm.icu.text.BreakIterator を使う。ちなみに java.text.BreakIterator だと7文字と数えてしまう。

package com.example.stringlengthsample;  

public class StringLengthSampleApplication {  
    public static void main(String... args) {  
        var str = "";  

        Function<String, Integer> len1 = s -> {  
            var it = com.ibm.icu.text.BreakIterator.getCharacterInstance();  
            it.setText(str);  
            var c = 0;  
            while (it.next() != com.ibm.icu.text.BreakIterator.DONE) {  
                c++;  
            }  
            return c;  
        };  
        System.out.printf("length %d: %s\n", len1.apply(str), str);  

        Function<String, Integer> len2 = s -> {  
            var it = java.text.BreakIterator.getCharacterInstance();  
            it.setText(str);  
            var c = 0;  
            while (it.next() != java.text.BreakIterator.DONE) {  
                c++;  
            }  
            return c;  
        };  
        System.out.printf("length %d: %s\n", len2.apply(str), str);  
    }  
}  

JavaScript

grapheme-splitter を使った。

const str = "";  

const GraphemeSplitter = require('grapheme-splitter');  
const splitter = new GraphemeSplitter();  
console.log("length ", splitter.countGraphemes(str));  

Go

ちょっと探したくらいだと簡単に使えるライブラリは見つからなかった。ないのかな。

参考にしたページ

文字数をカウントする7つの方法
How to count grapheme clusters or “perceived” emoji characters in Java
Unicodeのgrapheme cluster (書記素クラスタ)
Perl 5.26 & Unicode 9.0 で変わる書記素クラスタ(grapheme cluster)のお話

このログへのコメント

コメントはありません