MW211 EXIT

devlog
UTF-8のマルチバイト文字の文字長
2011年07月29日
全角文字(マルチバイト文字)は、
(非プロポーショナルフォントでは)半角文字2つ分の横幅をとる。

「Shift-JIS」などたいていの文字コードにおいては、
半角文字は「1バイト」、全角文字は「2バイト」であり、
この横幅の比率と一致する
つまり「文字長(横幅)=バイト長」である。

しかし、「UTF-8」において、全角文字は「3バイト」である(要は情報量が多い)。
つまり「文字長(横幅)<バイト長」となる。

一方、たいていのプログラム言語においては、
「文字数を求める関数」と「バイト長を求める関数」が
それぞれ用意されている。
PHPにおいては、文字数を求める関数は「mb_strlen(,'UTF-8')」で、
バイト長を求める関数は「strlen()」である。

「文字長(横幅)」を求めたい場合、全角文字が「2バイト」なら
「文字長=バイト長」なので、「バイト長」を求めるだけでよい。

しかし、全角文字は「3バイト」の「UTF-8」の場合はそうはいかない。

「文字数」と「バイト長」を駆使して「文字長」を求めようとすると
「(文字長+バイト長)/2」で求めることができることがわかる。

方程式を解けば導きだせる答えなのだが、
不思議なことに「足して2で割れば」文字長が算出できてしまうのである。
(1の比率のものと3の比率のものを足して2で割れば2の比率になるだけだが)

…と満足してたら、PHPには「mb_strwidth(,'UTF-8')」という文字長を
ダイレクトに求めることができる関数があったのであった。

  例)「ああAAA」の場合
    (1) strlen('ああAAA')               →  9(=全角2文字×3バイト+半角3文字)
    (2) mb_strlen('ああAAA','UTF-8')    →  5(=5文字)
    (3) mb_strwidth('ああAAA','UTF-8')  →  7(=全角2文字×2+半角3文字)
        ((1)+(2))/2=(9+5)/2=7=(3)
分類:PHP