このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Erlang EDoc、やんなっちゃう

「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バイトデータと“思う”だけ。