Knowledge Base

お知らせや身辺のことを綴っています。
目次
中華フォントはどうにかならないか?→ならない

中華フォントはどうにかならないか?→ならない

日本語の文脈で中華フォントを見かける機会があるとムッとする。しかし、これは結局ユーザーが悪いか、あるいは開発者が悪いかという問題に帰着する問題なのである。

中華フォントが表示されるのはなぜか

中華フォントが表示される原因には、そもそも2つの要因がある。1つ目は現代のOSが Unicode を使っていること、そしてもう2つ目はフォントと言語設定が画面表示に関わっていることである。

Unicode

一つ目の Unicode は、IT用語辞典によれば、「文字コードの国際的な標準規格の一つで、世界中の様々な言語の文字を収録して通し番号を割り当て、同じコード体系のもとで使用できるようにしたもの」である。

この記事の読者全員が必ずしも文字コードに明るいとは限らないため、簡単に文字コードが何であるかを説明すると、文字コードは我々が文字として見ている文字をデータとして取り扱うために紐づけられた数値の体系である。たとえば、「直」という文字には十進数表記で 30452という数字が割り当てられている。この数字をコードポイントと呼ぶこともある。スマートフォンやPCといったコンピューターはその数値に紐づけられた文字を表示して、それを文字として見ているのである。

さて、楔形文字から「pͪoͣnͬpͣoͥnͭpͣa͡inͥ」まで表現できるありとあらゆる文字が1つの巨大なアドレス空間に収録されるなかで、実は、中国語の簡体字、中国語の繁体字、および日本語の漢字で共通の漢字を示し、かつ字形が似ている文字に関しては、CJK 統合漢字(CJK Unified Ideographs) というそれぞれの漢字で同じコードポイントを共有している文字の範疇が存在する。なお、CJKというのは Chinese、Japanese、Korean の頭文字である。

たとえば、The Unicode Standard, Version 15.0 の文字表(https://unicode.org/charts/PDF/U4E00.pdf) を参照すると、「直」という漢字はこのCJK統合漢字の1つなのだが、同じ U+76F4 というコードポイントに複数の文字が含まれていることがわかる。なお、76F4というのは先ほどの30452という数字の16進数表記である。 左3つは「C」 すなわち中国語、そして4つ目は「J」すなわち日本語、5つ目が「K」 、韓国語、6つ目が「V」 、ベトナム語の字形というふうになっている。

かつて、言語別に文字コードが存在していたり、Shift-JIS や EUC-JP などといったように同じ言語でも複数の文字コードがあったりしていたのは昔の話で、現代においてその文字コードが画面上にどのように表示されるかということは、実はフォントと言語設定の問題なのである。

フォントと言語設定

CJK統合漢字がもたらす弊害は容易に中華フォントとして現れる。

筆者のAndroidのスマートフォンでは、端末の言語設定を日本語にしている限り、ありとあらゆる場所で日本語の漢字が表示される一方で、それ以外の言語に設定していると中国語の字形を表示するようになる現象が発生する。たとえば、以下は NHK NEWS アプリの記事のスクリーンショットである。上の画像が端末の言語を日本語に設定したときで、下の画像が英語に設定したときのものである。「文」や「反」などといった文字の形が大きく異なっているのがわかる。

日本語
英語

まず、この問題から、どうやら Android は、日本語と中国語繁体字以外の言語設定において、CJK 統合漢字を表示する際、中国語の字形を優先して表示するようになっているということが推測できそうだ。

さて、これをフォントの話に押し広げて考えていく。実は、このCJK 統合漢字に完全に対応した Noto Sans CJK がAndroidのシステムフォントとして利用されているという点に原因がある。

グローバル版スマートフォンの宿命

Noto Sans CJK JP

この Noto Sans CJK は、Google と Adobe が2014年にリリースし、以降世界中のコンシューマーに向けて販売されるグローバル版の大半の Android 端末にプリインストールされているフォントである。

普及した原因はそのポテンシャルの高さであり、それこそが中華フォント問題の原因だ。Noto Sans CJK はその名の通り CJK 統合漢字に対応しているフォントである。つまり、Android が端末の言語に応じて違う漢字の変種を表示するようにお願いしても、このフォント自体が繁体字中国語、簡体字中国語、日本語、韓国語、それぞれのそれぞれを表示しきれることのできる巨大なフォントセットを持っているから、正直に表示できてしまうのである。これこそがグローバル版のスマートフォンに含まれる理由と言っても過言はないのだろうが、だからこそこれは、本当にどうしようもできない問題だと思う。

最初から国内しかに販売されないスマートフォンであると分かっているなら、日本語の漢字のセットしか入っていない Noto Sans CJK JPだけを使えば済むのだが、Xiaomi や Huawei などといったスマートフォンのベンダーがグローバル仕様のスマートフォンを製造するときは、最初から漢字圏のユーザーがそのユーザーの言語にある漢字を利用できるように、中国語簡体字、中国語繁体字、日本語、韓国語の漢字を全て網羅した Noto Sans CJK を利用する必要性があることは前述のとおりである。だから、Noto Sans CJK はすばらしいし、Unicode も悪くない、悪くないんだけど…。

おわり

話の流れを踏んでもらえば、これは敢えて日本語の言語設定を利用せず、イキって他の言語を利用している人間の責任なのだが、率直に言えば、わざわざ言語設定を日本語に切り替えないと本来の文字を見せてくれないのは悲しいことだと感じる。なお、Chrome は HTML のlang属性などを見ているようで、言語設定を英語にしていても日本語の漢字を表示し続けてくれていた。社員の誰かが中華フォントを疎く思ったんだろうと思いたいところだ。

というわけで日々思っていたことに対する苦悩をポエムに乗せて、少々のリサーチとともに投げてみた。Unicode の勉強になったから、時間の無駄ではなかったと思う。

前の記事

PHPでカリー化を使ってみたよ

次の記事

能格動詞の観点から get の用法を完璧にしよう

コメント

0

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連投稿

技術
「LLMに英単語帳を作らせる」のサムネイル画像

LLMに英単語帳を作らせる

大規模言語モデルに要件に応じた英単語とその訳のリストを作らせるというコンセプトで書いたプロンプト、工夫した点を紹介し、出力結果の比較を行います。 続きを読む

技術
「コマンドを実行する際の心がけ」のサムネイル画像

コマンドを実行する際の心がけ

筆者がコマンドを実行する際、セキュリティー面で常々心がけていることについて述べます。 続きを読む

技術
「視聴用にイコライザを使わないという変なこだわりを捨てた」のサムネイル画像

視聴用にイコライザを使わないという変なこだわりを捨てた

ホワイトノイズによる現在のスピーカーの周波数特性の検証を通じて、最適なイコライザーのカーブを探ってみます。 続きを読む

技術
「WSLのインスタンスにリモートから接続する」のサムネイル画像

WSLのインスタンスにリモートから接続する

WSLと、リモートのクライアントとを接続させるために設定をする記事です。 続きを読む