メインコンテンツまでスキップ

内部コードを utf-8 に

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

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

google が ?? なる

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

日本語

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

entity.c: conv_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 列に変換する簡単なコードを入れよう。

fm.h ISO-8859-1 用?
#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 で書いてありそう。

描画システム

  1. html 文字列
  2. linebuffer(HTMLを2次元レイアウトして、色、bold, underline, などの装飾をしたもの
  3. term 向けの screen buffer(2次元grid)
  4. term 出力(escape sequence)

という手順を踏む。

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

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