「プログラマのための文字コード技術入門」書評

珍しく書評です。まだ書きかけなんですが、完成を待つと忘れそうなのでとりあえず。

断片的に見た感じとして、現在ある文字コード本では最高峰なんじゃないでしょうか。人に勧める文字コード本としては*1、長らく文字コード超研究がベストだったと思うのですが、今後はこれでしょう。

Ruby 1.8/1.9

ざっと見た限りでは誤りを見つけられませんでした。と、いうわけでこれはよい記述だと思います。

UCS-2

下記で引用を交えつつ紹介していますが、UCS-2は「文字集合」ではなく「文字符号化方式」でしょう。ISOの文書自身でもUCS-2文字集合であるかのように扱っている記述があるのがアレなんですが、定義を見ればISO/IEC 10646を見てもUnicodeを見ても文字符号化方式だと解釈するのが妥当です。

iconv (P154)

総評: glibc iconv/GNU libiconv の解説と書くべき。

まぁ、よくある誤りなんですが、iconvはPOSIXで標準化されているわけで、それを参照しながら語らないといけないよというお話。

Unix系の環境では大抵問題なく使えるコマンド

iconv(1)POSIXの規定内なので、まぁそりゃ使えるでしょう。

iconvで使用可能な文字コードの種類は、iconv --listと入力すると確かめることができます

前述のPOSIXの規定では、サポートしている名前のリストを返すのはiconv -lです。例えばNetBSDのiconv(1)にはiconv --listがありません。

変換元のテキストに含まれる文字が、変換先の文字コードにない場合は変換できません。
(中略)
エラーが出て止まってしまいます。

iconvにオプション-cをつけて実行すると、変換できない文字は無視して先に進みます。

重大な誤りです。iconv(3)もそうなんですが、iconvの規定では、

  • 入力としては正当だが、出力先の文字コードに存在しない文字
  • 入力として不正なバイト列

を明確に区別しており、前者はとりあえず変換すること、後者は問答無用でエラーにすることとしています。iconv(3)の記述は以下の通り

If iconv() encounters a character in the input buffer that is valid, but for which an identical character does not exist in the target codeset, iconv() shall perform an implementation-defined conversion on this character.

http://www.opengroup.org/onlinepubs/9699919799/functions/iconv.html

で、iconv -cの記述は以下のとおりで、"invalid in the codeset of the input file"の意味が取りづらいのですが、"The presence or absence of -c shall not affect the exit status of iconv."という言及があるところからするに、これも出力で未定義な文字のこと、つまり前者だけの話で、エラーで止まっちゃうのは誤りなんでしょう。

-c
Omit any characters that are invalid in the codeset of the input file from the output. When -c is not used, the results of encountering invalid characters in the input stream (either those that are not characters in the codeset of the input file or that have no corresponding character in the codeset of the output file) shall be specified in the system documentation. The presence or absence of -c shall not affect the exit status of iconv.

http://www.opengroup.org/onlinepubs/9699919799/utilities/iconv.html

あと、そもそもiconvの-tと-fの引数に何を渡せるかは機種依存です―というツッコミがあるんだけど、これはP275に書いてありますね。

nkf (P156)

自分とこのプロジェクトであれなんですが、規格外のコマンドなのでプロジェクトのURLくらいは載せて欲しいな。

charsetパラメータ (P188)

Shift_JIS」とか「EUC-JP」とか「ISO-8859-1」とかいう指定が全く信用ならん、っていう言及は今時の記述なら欲しいなぁ。

この記事の更新履歴

  • 02-23
    • charsetパラメータにHTML5のURLを追加
    • Rubyの記事に対する記述を追加
    • UCS-2についての記述を追加

*1:ようは文字コードヲタ向けじゃないって意味ね。ヲタ向けなら1位は『文字符号の歴史−欧米と日本編−』