シングルバイト
"a"
の文字数は1になるはず
"a".length
//> res0: Int = 1
1でした
マルチバイト
"あ"
の文字数は1になる? もしくは3?
"あ".length
//> res1: Int = 1
1でした。
Unicodeサロゲートペア
"?"
の文字数は1? もしくは2? それとも4??
"?".length
//> res2: Int = 1
1でした…!
次は、NFC、NFDの違いも調べたい
参考までに他の言語も調べてみた
Java
class Untitled {
public static void main(String[] args) {
System.out.println("a".length()); // 1
System.out.println("あ".length()); // 1
System.out.println("?".length()); // 2
}
}
JavaがScalaと違うということは、Scala側でサロゲートペアを吸収してるってことかな
PHP
<?php
var_dump(strlen("a")); // 1
var_dump(strlen("あ")); // 3
var_dump(strlen("?")); // 4
// マルチバイト対応関数
mb_internal_encoding("UTF-8");
var_dump(mb_strlen("a")); // 1
var_dump(mb_strlen("あ")); // 1
var_dump(mb_strlen("?")); // 1
Node.js
console.log("a".length); // 1
console.log("あ".length); // 1
console.log("?".length); // 2
Go
package main
func main() {
println(len("a")) // 1
println(len("あ")) // 3
println(len("?")) // 4
}
Ruby
puts "a".length # 1
puts "あ".length # 3
puts "?".length # 4
Node.js、Go、Rubyもマルチバイト対応の関数があるかもしれないが、そこまでは調べてない。