マクロを除去して libwc 回りを削除したため ASCII しか表示できなくなりました。 HTML は utf-8 で記述されているので、無変換で出力できれば表示されるはずの部分が、 ?? となっています。

w3m の内部コードを素の utf-8 に変えることを試みます。

unknown: html => {"type":"html","value":"<!-- truncate -->","position":{"start":{"line":8,"column":1,"offset":143},"end":{"line":8,"column":18,"offset":160}}}

google が ?? なる

どうも ISO-8859-1 内にエスケープされて日本語が来ているらしい。

&#26085;&#26412;&#35486;

USE_M17N と USE_UNICODE を落としたので entity 複合が無くなっていました。

#ifdef USE_M17N
#ifdef USE_UNICODE
    if (c <= WC_C_UCS4_END) {	/* Unicode */
	char *chk;
	wc_uchar utf8[7];
	wc_ucs_to_utf8(c, utf8);
	/* we eventually need to display it so check DisplayCharset */
	chk = wc_conv((char *)utf8, WC_CES_UTF_8, DisplayCharset ? DisplayCharset : WC_CES_US_ASCII)->ptr;
	if (strcmp(chk, "?") != 0)
	    return wc_conv((char *)utf8, WC_CES_UTF_8, InnerCharset)->ptr;
    }
#endif
#endif
    if (c == 0x201c || c == 0x201f || c == 0x201d || c == 0x2033)
	return "\"";
    if (c == 0x2018 || c == 0x201b || c == 0x2019 || c == 0x2032)
	return "'";
    if (c >= 0x2010 && c < 0x2014)
	return "-";
    if (c == 0x2014)
	return "--";
    return "?"; // 👈 これになっていた。

unicode code point を utf-8 byte 列に変換する簡単なコードを入れよう。

#define get_mctype(c) (IS_CNTRL(*(c)) ? PC_CTRL : PC_ASCII)
#define get_mclen(c) 1
#define get_mcwidth(c) 1
#define get_strwidth(c) strlen(c)
#define get_Str_strwidth(c) ((c)->length)

この辺ぽい。 むしろ、USE_UNICODE を捨てた状態が ISO-8859-1 用になっていそうなので、 これに、entity 経由の utf-8 混ぜることうまく動かなくなってしまうかもしれない。 1文字 = 1byte = 1column で書いてありそう。

描画システム

  • html 文字列

  • linebuffer(HTMLを2次元レイアウトして、色、bold, underline, などの装飾をしたもの

  • term 向けの screen buffer(2次元grid)

  • term 出力(escape sequence)

という手順を踏む。

1と2 の間、2と3の間でマルチバイト文字の対応が必要。

USE_M17N と USE_UNICODE を無効にすると1文字=1byte=1columnになることを確認した。 部分的に USE_M17N と USE_UNICODE を復旧する。