はじめに
新元号発表
本日4/1お昼ごろ、新元号が「令和」と発表されました。
さて、この新元号に含まれる「令」という文字ですが、これは「CJK互換漢字」といわれるUnicodeにおける特定のグループに含まれる文字のひとつであり、Unicodeに同一の「令」という文字が、ふたつ含まれているのです。
本記事は、
- Unicodeについての基本知識
- CJK互換文字とは何か?
- 「令」がなぜ、CJK互換文字に含まれるのか?
- アプリケーション開発への影響
について調査してまとめたものです。
Unicodeについて
CJK互換漢字について理解するためには、まずUnicodeの理念およびUnicodeのラウンドトリップ変換互換性の原則についてを理解する必要があります。
Unicodeとは
Unicode(ユニコード)は、16ビットの整数値で表した符号位置と、文字とを対応付ける規格のことです。
「符号位置」とは、その文字に割り振られた番号のことです。たとえば「魚」なら9B5A
です。Unicodeであるということをわかりやすくするため、U+9B5A
のように「U+」を付けて表記されることも多いです。
Unicodeは、「世界で使われる全ての文字を共通の文字集合にする」という目標のもとで既定されました。「すべて」というだけあって、絵文字や古代文字なども含んでいます。
ラウンドトリップ変換互換性
Unicodeにおける符号位置の決定は、「ラウンドトリップ変換互換性の原則」を守って行われています。
「ラウンドトリップ変換互換性の原則」を非常に簡単に説明すると、「もととなる文字コードにおいて別々の符号位置を持つ漢字は、Unicodeにおいても別の漢字として扱い、別々の符号位置を与えなければならない」
という内容です。
この原則の目的は、元の文字コードからUnicodeに変換した際に、可逆性が失われるのを防ぐことにあります。
補足:じゃあ、UTF-8とかUTF-16は?
UTF(Unicode Transformation Format)-8やUTF-16等の文字コードは、Unicodeで決まっている符号位置を、どのようなバイト配列で符号化するかの方式です。
Unicodeが情報の中身について規定するもの、UTF-8等は情報を表現する方法について規定するもの、と考えておけば良いです。
参考:「UnicodeとUTF-8とUCS-2の関係 ――符号化文字集合? 文字符号化方式?」プログラマのための文字コード技術入門
CJK互換漢字について
CJK互換漢字
CJK互換漢字は、Unicodeに含まれるブロック(文字のまとまり・文字コード領域)の一つです。
Unicodeのうち512文字ぶんの、U+F900
~U+FAFF
の範囲が割り当てられています。
以下では、なぜこのブロックが必要なのかを説明します。
CJK統一漢字
Unicodeには、日本・中国・韓国で使われる漢字について、由来が同一であり、字形が同じか、似ているものを「同じ漢字である」と見做して統合したCJK統合漢字というブロックが存在します。
CJKは、Chinese Japanese Koreaの頭文字です。
ちなみに、これらの統合基準は見ての通り曖昧なものなので、この規定からはずれた統合のされ方をしている漢字もあるようです。
CJK統一漢字だけではダメな理由
前述のとおり、CJK統一漢字は「字形が同じものを統合したもの」です。なので、例えばKS X 1001のように、「同じ字形で、別の符号位置を持つ文字が存在する文字コード規格」については、CJK統合漢字ブロックしか存在しない場合、ラウンドトリップ変換互換性の原則が破られてしまうことになります。
この問題点を解消するために存在するのが、CJK互換漢字ブロックなのです。
「令」はなぜCJK互換漢字なのか?
さて、やっと「令」の話に戻ってくることができました。
ここでは、これまでの話を踏まえて、「令」がなぜCJK互換漢字に含まれているのかについて説明します。
KS X 1001
KS X 1001は、漢字が読みの順で配列されている文字コードです。特徴として、複数の読みがある漢字は複数収録されているということが挙げられます。
日本語とは異なり、韓国語における漢字の読み方は、基本的に1通りです。しかし、いくつかの漢字には複数の読み方があります。
KS X 1001、Unicodeでの「令」
KS X 1001での「令」
「令」は、韓国語において、령(ryeong)、영 (yeong)の2通りの読みがある漢字です。
KS X 1001において、「令」は령(ryeong)の5635、영 (yeong)の6729という2箇所の符号位置を持ちます。
Unicodeでの「令」
Unicodeでは、CJK統合漢字として、韓国語の령(ryeong)読みの「令」を符号位置U+4EE4
の漢字に採用しています。
一般的な日本語入力システムにおいて「レイ」「リョウ」などを変換して入力される「令」は、CJK統合漢字であるU+4EE4
です。
そして、ラウンドトリップ変換互換性のために、CJK互換漢字として、영(yeong)読みの「令」も採用しています。
Unicodeにおける2つの「令」について、簡単な図にしてみました。
アプリケーション開発への影響
一般的な日本語入力システムを使っていれば基本的にはU+4EE4
の「令」が入出力されるはずです。また、CJK互換漢字には、「索」や「立」など、日常的によく使われる漢字が含まれています。「令」がCJK互換漢字だからといって、神経質になりすぎる必要はありません。
しかし、厳密に文字列の一致を判定したい場面では注意が必要です。
CJK統合漢字の漢字と、CJK互換漢字の漢字を同一の文字とみなすかどうかは、関連するフレームワークやライブラリによっても異なります。
たとえば、Chromeのページ内検索窓においてはCJK統合漢字の漢字とCJK互換漢字の漢字は同一の漢字として扱われますが、Unicode符号位置を比較して判定するようなロジックのアプリケーションでは異なる文字として扱われるでしょう。
これらを同じ文字として扱うかどうかは、実装段階になって簡単に決めることができるものではありません。機能やアプリケーションの用途・目的を考えて、設計時点から検討することが大切だと考えます。
まとめ
今後以前より多く登場することが予測される「令」について、その理由と、どのように注意が必要なのかを簡単に調査しました。
ふたつの「令」がUnicodeに含まれる理由は、韓国語において「令」に2通りの読み方があることと、Unicodeの仕様によるものであることがわかりました。
アプリケーション開発への影響は要件に応じて異なるので、はやめの段階でしっかり検討していきましょう。
誤りや不足があれば、著者Twitterまたはコメントにてご連絡頂けると助かります。