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

2003/03/22(Sat)

HZ+

@

実装しはじめたけど

~{~}~{~}~{~}...

みたいな冗長なエスケープシーケンスがあった場合、

  • MB_LEN_MAX溢れたら0を返せば良い
  • wchar_tへの変換の過程で冗長部は失われてしまっても構わない

なんで、特に悩まないでも良さそうだ。
少なくともCitrus XPG4DLのISO2022実装はそうなってる模様↓

#include <limits.h>
#include <locale.h>
#include <wchar.h>
int main(void) {
	char s0[] = {0x1b, 0x24, 0x42, 0x1b, 0x24, 0x42, 0x1b, 0x24, 0x42, 0x24, 0x22, 0x0 },
	s1[MB_LEN_MAX];
	wchar_t wc;
	setlocale(LC_CTYPE, "ja_JP.ISO2022-JP");
	printf("%d\n", mbtowc(&wc, s0, sizeof(s0))); /* -> 変換結果11byte */
	printf("%d\n", wctomb(s1, wc)); -> /* 変換結果5byte */
}

glibc2はどうしてるのかは確認できず。

@

あとはwchar_tに

  • US-ASCII
  • GB2312
  • BIG5 1部(0xA140-)
  • BIG5 2部(0xC940-)
  • BIG5 (0x8140-0xA0FE)

をどうmappingするかだな。GB2312は単純に(c | 0x80)なんだけど、
BIG5を7bitにするルールが割と変則で汎用性がなかったり。
今後の拡張(~[!-z|]がescape sequenceにreserveされてる、まあ無いだろうが)を考慮し、
BIG5に戻さずそのままマスクしちまうか。

@

ググっってたらHZの8bit版EHZとかHZ+8とかいろいろ出てきた...↓
ttp://www.ibiblio.org/pub/packages/ccic/software/unix/convert/
ワケ・ワカ・ラン(AA略)