文字コードの簡単な勉強

文字コード再入門 ─ Unicodeでのサロゲートペア、結合文字、正規化、書記素クラスタを理解しよう!
【図解】【3分解説】UnicodeとUTF-8の違い!【今さら聞けない】
バイト順マーク

ざっくりいうと

  • Unicodeはあらゆる文字を何でも頑張って16ビットで何でも表現(コードポイントと呼ぶ)しようとしたよ。
  • でも、足りなかったよ。なので、2文字分(32ビット)で忖度することにして、こっちに突入するものをサロゲートペアと呼ぶよ。
  • Unicodeを符号変換する方法にはUTF-16、UTF-32、UTF-8があるよ。
    • この辺を見分けるためにBOMという決め事で自己紹介できるよ。
    • ただし、UTF-8でBOM有無を判別しないソフトウェアもあったりするので気をつけてね。

ググると、日本では俗に「外字」と言われる範囲がそれに当たります。
𠮷野家とか。

Javaでの落とし穴?

Java の文字型 (char)

文字列長

  • String#lengthだと、Unicode(UTF-16)換算の長さになる。
  • String#codePointsだと、実際の文字の長さ(コードポイントの個数)になる
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class CharacterValidatorTest {
  private final String yoshi = "\uD842\uDFB7";

  @Test
  public void Lengthだと2が返ってくる() {
    assertEquals(2, yoshi.length());
  }

  @Test
  public void CodePointだと1が返ってくる() {
    assertEquals(1, yoshi.codePointCount(0, yoshi.length()));
  }
}

Bean Validator

@Length, @Size共に、Unicode単位。
@CodePointLengthを使いましょう。

※ 日本人がコントリビュートしてくれてる。