蝉は、やがて死ぬる午後に気づいた。ああ、私たち、もっと仕合せになってよかったのだ。:2006年11月09日分

2006/11/09(Thu)

NetBSD

@mapper_zone

Citrus iconvはesdbで指定されているDEFCSIDがfromとtoが一致したらピボット変換しない(必要ないので)。
先日対応したCP51932/CP50220だけど、CP932とは収録文字数に差がある(前者にはユーザ定義文字とか
IBM拡張文字が含まれないのよー)。その為に異なるDEFCSIDを振らざるを得なかったので
両者の変換は必ずUnicodeを経由しての変換になってしまう。
ダサダサ。

もっとスマートなやり方ならばshare/i18n/csmapper/mapper.dir で

CP932/CP51932	mapper_zone	0x2121 - 0x7426, 0x7921 - 0x7C7E
CP51932/CP932	mapper_zone
...

とか書ければ一番いいんだけど(それならCP932EXT%UCS.srcを3分割する必要もなかった)
mapper_zoneは細かいZONE指定に対応していないんだよなー。
直すのはそんなに手間じゃないはずなので、TODOに追加しておこう(いれときっぱなしー)。

これ対応すればこないだJOHAB対応時にKS5601のテーブルを2分割したのも元に戻せる。

...ってdistrib/sets/lists/base/miで一度obsoleteにマークしたものって戻して良いんだっけ?

@VIQR(RFC1456)

それがVIPクオリティ、じゃなくてヴェトナムの7bitコード、メールやニュースグループで使用されてたらすい。
文字集合はVISCII、符号化手法はISO-2022のような状態遷移を使うのではなく、RFC1345のようなニーモニックを使う。

A	-> 0x41
A(	-> 0xC5
A('	-> 0x81
A(.	-> 0x83
A(`	-> 0x82
...

ニーモニックではなくリテラルで

A(`

を表現したい場合、エスケープ文字として0x5cを使い

A\(`

と書く、符号化手法というより換字ですな。

というわけで(どういうわけで)、これもまた DR#288のケースだね。
mbrtowc(&wc, ...)がwc != L'\0'の場合でも(size_t)0を返す可能性がある。
またwc->mb に戻す時、前の文字がニーモニックの1バイト目と被るASCIIの文字である場合
エスケープが必要なのでその情報をmbstate_tで保持する必要がある。
つまり mb -> wc はstatelessだけれども wc -> mb はstatefulなパターン。

実装自体はニーモニックを1文字づつバラしたツリーを辿る方法で簡単にできるっぽ。
テストしたらcommitするよん。