AltConf で アジア圏の文字について の話を聞いてきました #WWDC19 #AltConf19

こんにちは、モバイルアプリサービス部の田中孝明です。

毎年恒例ですが、 WWDC の 隣で AltConf 2019 というカンファレンスが同時に開催されています。こちらではCFPに通ったエンジニアの方々が登壇されています。

今回は LINE Fukuoka の Tomoki Yamaguchi さんの A story of Mysterious Asian Strings という発表を聞いてきました。 アジア圏ならではの文字について話されていました。

Description

Some people may think all strings can be represented with ASCII. But actually, it’s impossible. We are providing app with Japanese, Korean, Chinese, Thai, ... and many other languages. String.count is not always the same as you see. Character sometimes exceeds UILabel. Delegate methods can pass wrong strings. I’ll share about stories and techniques about these Asian characters, which English speakers may not know.

アジア圏の文字がどのように作用するか?

あるECのアプリの例です、これらは日本語表示にした場合、文字列の長さで問題が出ることがあります

全角と半角

  • 日本語、中国語、韓国語の文字は全角です
  • アルファベット、数字も同じスタイルです

テキストのレイアウト

縦書き

  • 日本語、中国語、韓国語は縦書きで表すことができます
    • 縦書きの場合は右から左に読みます
    • 横書きの場合は左から右に読みます
  • Kindle ではサポートされています

タイ語はしばしば UILable を超過する

  • タイ語特有のものです

文字数のカウント

  • 文字数をカウントする方法はいろいろあります
    • UTF-8, 書記素クラスタ(grapheme cluster), unicode scalar
  • Appleのデフォルト (String.count) は 書記素クラスタ(grapheme cluster) です

アルファベットの文字数カウントは簡単

アジア圏の文字数カウントは難しい

  • 各メソッドは異なる長さを返します
    • .utf8.count
    • .unicodeScalars.count
    • .count
  • .count は期待した値を返す場合が多いです
    • なので、ユーザーフレンドリー
    • 推奨

  • タイ語の 書記素クラスタ(grapheme cluster) は文字数 1 で返ります
    • メモリサイズを制限してオーバーフローを防ぐ必要があります

バグが見つかるか?

特定の文字数以上入力されたくない場合、文字変換が問題となる

  • 一つの文字は複数の文字を組み合わせにすることもできます(例は韓国語)
  • 挿入・削除しても、文字数は変わりません
  • まるで置き換えのように動きます

変換後に文字数を検証する必要がある

  • 入力中に操作をブロックすると、変換中の操作を妨害してしまう

replacingCharacters の結果は間違っている可能性がある

  • 入力と出力が一致しない
    • かいはつしゃ -> 開発者 のように結果が短くなることがある

結論

  • 文字の幅と高さに注意
  • 文字数カウントのやり方に注意
  • 入力をブロックしない

まとめ

英語圏だとあまり気にされない文字についてですが、CJK を含むアジア圏の文字列の扱いについては、昔から議論のネタになっていました。今回登壇者がコミュニケーションツールを作成されているということもあって、このあたりの話を再確認できたのは良かったです。

参照