ベトナム語の文字コード-VISCII

ベトナム語はいったいどんな文字コードなんだろう?と調べてみました。
今日でこそ Unicode にベトナム語の装飾ゴテゴテの文字が収録されていたり、結合文字で解決できる訳ですが、それ以前はどうしていたのかと-つまり、日本で言うところの Shift-JIS とか JIS X 0201 とかに対応するモノは…という話で。

探してみると”VISCII”, “TCVN “というモノがあるそうです。

この”VISCII”、コード表を見てみると、もはや反則技とも思えるような荒技が繰り広げられておりました。

制御領域にも派手に文字が割り当てられております。
0×80-0x9Fは文字で埋まっています。
0×02, 0×05, 0×06, 0×14, 0×19, 0x1E にも文字が割り当てられております。

いいのかよ…
確かに、0x1F以下に定義されている文字は、ベトナム語ではほぼ出現することが無い文字(組み合わせとしてはあり得る)なので、まぁいいっちゃいいのでしょうが…

なお、各種資料をあさってみると、RFC 1456 と共にカリフォルニア州で作られたらしいので、ベトナムの国家規格という訳ではありません。

一方の”TCVN”の文字コードは、”TCVN 5712″。こちらは国家規格で、日本的には”JIS”みたいなもんでしょう。
文字コード表はこちら
まるでISO-2022 シリーズのような表です。

まぁ、実際には、Unicodeを使うのが一般的なのですが、こんなのもありますって話で。

続:ạに関する諸問題

Windows の標準ベトナム語入力からạを入力すると二文字になるというのは、前回の記事。

ですが、Wikipedia上では、一文字の「合成済み」が標準として使われているようです。(Wikipediaの規約などを調べたわけではないので推測です。)

なので、ベトナム語版Wikipedia で「ホーチミン」のページを開くと、URLは下図のようになります。(Firefox 10 の場合。)

URLをWord に貼り付けると、こうなります。

http://vi.wikipedia.org/wiki/H%E1%BB%93_Ch%C3%AD_Minh

 

さて、このURLをWindowsから手入力してみます。” Hồ_Chí_Minh”を上記URLの/wiki/ の後に貼り付けます

URLを同様にWordに貼り付けると、こうなります。

http://vi.wikipedia.org/wiki/H%C3%B4%CC%80_Chi%CC%81_Minh

 

二つのURLは厳密には違うところに注意してください。

しかしながら、Wikipediaは両者を「同じもの」とみなして、同じ内容を表示しています。

 

ここまで来るともう少し意地悪してみたくなります。

これら二つの「ホーチミン」を検索エンジンに投入するとどうなるのか?

さっそくBingとGoogleでやってみました。(Firefoxの検索ボックスから投入しただけという、実に手抜きなテストです。)

それぞれ、上段が合成文字、下段が合成済み文字です。

Bing

Google

 

なかなか見事な結果がとれました。

Bingはこれら二つを「別のもの」として扱っています。そのため、検索結果は大きく割れて、合成文字で入力した場合には欲しい情報が得られない可能性があります。

Googleはこれら二つを「同一のもの」として扱っています。結果はほぼ同じです(1億超を全部比較したわけではないので断定はしません)。

ạ に関する諸問題

日本人があまり目にすることはない字ですが、確かに世の中に存在します。
ベトナム語で使用される文字です。”a”に、声調記号の.が付加された文字です。
(豆:thanh nặnh という声調を表す記号です。)

で、この文字を、Windows から標準ベトナム語入力を使用して入力すると、
U+0061 (Latin Small Letter A)
U+0323 (Combining Dot Below)
の二文字になります。二文字ですが、aの真下にドットが描画されるのが正しい動きです。考慮されていないフォントの場合には、aの次に文字化け記号が表示されることがあります。

ところが、同じ文字を iOS から入力してみたところ、
U+1EA1 (Latin Small Letter A With Dot Below)
という文字になりました。

前回の記事 続:「が」と「が」は等しいか? の問題が「何から入力したか」によっても発生するわけです。

どちらが正しいとかそういう話ではなく、混乱の元になりそうな話ではあります。
何も考えずに単に「文字」として比較すると酷い目にあえそうな、そんな感じです。

続:「が」と「が」は等しいか?

前回は「が」の話でしたが、今度は「ệ」です。
以前「今更な文字列長の話」で取り上げた文字です。

これをWindows 7 + 標準のベトナム語入力メソッド で入力すると、合成文字になります。
ê : U+00EA に、声調記号の下ドット U+0323 (Combining Dot Below) が結合しています。

ですが、「が」の時と同じように、全く同じ文字が別のコードに割り当てられています。

「ラテン拡張追加」の U+1EC7 に “Latin Small Letter E With Circumflex and Dot Below” として が割り当てられています。たとえば Wikipedia 上では、こちらの U+1EC7 を使うのが一般的なようです。

そこで簡単な実験。Wikipedia で「ベトナム」のページを開きます。画面右にベトナム語での国号が書かれています。ブラウザ内検索 [Ctrl] + [F] で「ê」を検索します。
結果は、「ヒットしない」です。(IE9 と Firefox 9.0.1 で検証)
(まぁこのページで実験していただいてもよいのですが…)

確かに文字コードとしては別物ですが、ユーザーはそうは考えないかもしれません。
例えば、なぜ画面上に表示されている「か」を検索できないのかを義母に説明するとか、そういうことを考えるとちょっと恐ろしくなります。

「が」と「が」は等しいか?

間違い探しクイズのような感じですが、この二つの「が」は厳密には違います。

「が」 – U+304C

「が」 – U+304B U+3099

と、異なる文字で記述しています。見た目は(フォントなどによりますが)一緒です。話がややこしくなるので、1文字の方を「」、2文字の方をが」とします。
(U+3099 は、”Combining Katakana-Hiragana Voiced Sound Mark” という名前がついています。結合文字用の濁点です。)

なお、手元の環境 (Win7 + ATOK) で「が」を入力すると1文字の方の」でした。

ということは、String.Length をとると…

」 = 1

が」 = 2

となります。さらに、これらを入れたStringを比較すると…

Dim strOne As String = "が"  '---一文字の方です

Dim strTwo As String = "が"  '---二文字の方です

MsgBox(strOne = strTwo) '---FALSE が表示される

となります。確かにString オブジェクトの中身という観点では正しい挙動なのですが、見た目が同じなのでかなりややこしい問題の元になりそうです。

これをこうしてみます。

Thread.CurrentThread.CurrentCulture = New Globalization.CultureInfo("ja-JP")

MsgBox(String.Equals(strOne, strTwo)) '---FALSEが返却されます

MsgBox(String.Equals(strOne, strTwo, StringComparison.CurrentCulture)) '---TRUEが返却されます

後者のコードは、明示的に”ja-JP”カルチャーで比較するようにしたものです。

このあたりについては、MSDN : .NET Framework で文字列を使用するためのベスト プラクティス に詳しいのですが、やたらと話が入り組んでいてわかりにくいのが難点です。