PONOS Advent Calendar 2024の1日目の記事です。
ちょっとした困りごとから調べ物を始め、Unicodeの沼にはまりました。
結局、根本的な原因までは突き止められずだったのですが、分かったところまで書いておきます。
起こっていること
Googleドキュメントで黒丸(●)を使うとき、状況によってサイズ感が変化してしまいます。
※ 「●aiueo」の2文字目に「あ」を入れると、「●」のサイズが変わってしまう
こんな感じで、続く文字が「a」のときは小さく、「あ」だと大きく変化します。
Unicode環境ではありますが、いわゆる半角文字か全角文字かで変化するようです。
なぜこうなる?
「●」がUnicodeにおける「あいまい幅文字」だからです。
※ 実はこれだけだと半分しか解決していません。
後述のとおり別のPCだとサイズが変わらなかったりもするのですが、その違いまでは調べきれず。
Unicodeと半角/全角
Unicodeは言語を問わず1つの文字コードで扱える仕組みです。
Shift-JISと違って、半角だから1バイト・全角は2バイトと決まっているわけじゃないのですが、依然として半角/全角の区別は存在します。
主に固定幅フォントの環境で効いてくる区別で、字体のバランスからアルファベットは半角、漢字やひらがなは全角で表現されます。
あいまい幅(Ambiguous Width)の文字
ややこしいのが、文脈によって文字幅が変わる文字の存在です。
あいまい幅(Ambiguous Width)と呼ばれています。
A(Ambiguous; 曖昧)- 文脈によって文字幅が異なる文字。東アジアの組版とそれ以外の組版の両方に出現し、東アジアの従来文字コードではいわゆる全角として扱われることがある。ギリシア文字やキリル文字など。
東アジアの文字幅
旧来の文字コードとの互換性を維持するための措置で、同じ文字であっても文脈によって全角になったり半角になったりします。
たとえばギリシャ文字の「α」は、Shift-JISだと漢字と同じ2バイト全角扱いですが、greek(ISO-8859-7)では1バイト半角で表現されています。
ギリシャ語のテキストの中に急に全角αが出てきたらおかしいので、そういう場合は半角で表示されることになります。(逆に日本語文の場合は全角になる)
つまり・・・
「●」も同じく、あいまい幅だったようです。
念のため裏取りをしてみます。
East Asian Widthの設定値一覧が書かれたテキストファイルです。
「●」のUTF-16コード25CF
を探してみると・・・。
25CC..25CD ; N # So [2] DOTTED CIRCLE..CIRCLE WITH VERTICAL FILL
25CE..25D1 ; A # So [4] BULLSEYE..CIRCLE WITH RIGHT HALF BLACK
25D2..25E1 ; N # So [16] CIRCLE WITH LOWER HALF BLACK..LOWER HALF CIRCLE
ありました。
真ん中の25CE..25D1
の範囲に包括されています。
設定値はA
、つまりAmbiguous(あいまい)です。
「●」もあいまい幅扱いだったことが確認できました。
わかっていないこと
実はこの問題、手元にあるPC2台のうち、片方でだけ発生している事象だったりします。
Googleドキュメントで「Century」フォントを使ったときに発生します。
同じファイルを開いたときでも、PC-AとPC-Bで表示が異なります。
「Century」+ PC-A
文脈がアルファベットの場合は小さいサイズ(半角扱い)、ひらがなだと全角になります。
さらに、PC-Aでもフォントによっては状態が違ったりします。
「Arial」に変更すると、両方とも半角になります。
PCごとの設定の違いやフォントの違いが影響するのかもしれません。
また機会があれば調べてみたいと思います。
次回は@kerimekaさんです!
よろしくお願いします。