「Erlang実験室:EDocで日本語を使う方法」において、小さなパッチでEDocにUTF-8を処理させる方法を紹介しました。が、「Erlang EDoc、一筋縄ではいかないや」ではそれが不完全なことを報告しました。
それで、別な方法で直してみたら、次のような表示ができるようになりました。
一見よさそうですが、よく見てください。Copyrightの後にクエスチョンマークが出ているでしょ。これ、ほんとはコピーライト記号(copyright sign; マルC)のはずなの。
ウゲゲゲゲ、この文字化けの背景事情を考えたら頭痛がしてきたよ。
やっぱり、EDocの作成者はISO 8859-1 (Latin-1) の世界にいるな。コピーライト記号は、ISO 8859-1では169番(16進で0xA9)に割り当てられています。この番号はそのままUnicodeにも採用されて、コピーライト記号=U+00A9 です。
たぶん、EDocのソースのどこかに、0xA9(1バイト)を使ったリテラルとしてコピーライト記号が入っているんだろうね。その1バイトの0xA9はそのま出力のHTMLに吐き出されます。しかし、出力HTMLはUTF-8としてブラウザに解釈されるので、うまくコピーライト記号が出ないのです。UTF-8によるコピーライト記号は、[194,169]と2バイトにしないといけないから。
現象としては、単一の文字列(整数リスト)のなかに、ISO 8859-1、UTF-8、UCS-4 のエンコーディング達が混ざるような状況があるわけです。幸い(?)にもErlangでは、整数表現のバイト数は問題にならない*1ので、ISO 8859-1とUCS-4(UTF-32)は互換と考えてもいいのですが、UTF-8とUCS-4が混じっているのは辛い。
あー、やんなっちゃう。
[追記]でも、“別な方法で直した”バージョンは実用上問題がないような気もします。もう少し自分で使ってみてOKなら、パッチを公開します。[/追記][追記 date="2007-10-02"]→コレ[/追記]
*1:整数は常に無限多倍長、値の範囲によりNバイトデータと“思う”だけ。