Unicode結合文字の取り扱い

ちょっと調べた範囲では結合文字は、文字数のカウントなどで特別扱いしたりせずに普通の文字と同じ扱いになる。結合文字を考慮して、人間の直感と一致する文字単位で文字を取得したり、文字数を調べたりする方法はないものか。

Java / Scala

Scalaでの例

val str = "a\u0304";
println(str);
// => ā

val len = str.length();
println(len);
// => 2

println(str.codePointCount(0, len));
// => 2

val str2 = "\u0101";
println(str2);
// => ā

println(str == str2);
// => false

Python

str = "a\u0304"
print(str)
# => ā

print(len(str))
# => 2

str2 = "\u0101"
print(str2)
# => ā

print(str == str2)
# => False

Ruby

str = "a\u0304"
p str
# => ā

p str.length
# => 2

str2 = "\u0101"
p str2
# => ā

p str == str2
# => false

Perl

use utf8;
use Encode qw/encode_utf8/;

print encode_utf8("a\x{0304}\n");
# => ā

print length("a\x{0304}");
# => 2

print encode_utf8("\x{0101}\n");
# => ā

if ("\x{0101}" eq "a\x{0304}") {
    print "equals";
} else {
    print "not equals";
}
# => not equals
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。