📄 unicode.c
字号:
static void link_font(WCHAR * line_tbl, WCHAR * font_tbl, WCHAR attr);
void init_ucs(Config *cfg, struct unicode_data *ucsdata)
{
int i, j;
int used_dtf = 0;
char tbuf[256];
for (i = 0; i < 256; i++)
tbuf[i] = i;
/* Decide on the Line and Font codepages */
ucsdata->line_codepage = decode_codepage(cfg->line_codepage);
if (ucsdata->font_codepage <= 0) {
ucsdata->font_codepage=0;
ucsdata->dbcs_screenfont=0;
}
if (cfg->vtmode == VT_OEMONLY) {
ucsdata->font_codepage = 437;
ucsdata->dbcs_screenfont = 0;
if (ucsdata->line_codepage <= 0)
ucsdata->line_codepage = GetACP();
} else if (ucsdata->line_codepage <= 0)
ucsdata->line_codepage = ucsdata->font_codepage;
/* Collect screen font ucs table */
if (ucsdata->dbcs_screenfont || ucsdata->font_codepage == 0) {
get_unitab(ucsdata->font_codepage, ucsdata->unitab_font, 2);
for (i = 128; i < 256; i++)
ucsdata->unitab_font[i] = (WCHAR) (ATTR_ACP + i);
} else {
get_unitab(ucsdata->font_codepage, ucsdata->unitab_font, 1);
/* CP437 fonts are often broken ... */
if (ucsdata->font_codepage == 437)
ucsdata->unitab_font[0] = ucsdata->unitab_font[255] = 0xFFFF;
}
if (cfg->vtmode == VT_XWINDOWS)
memcpy(ucsdata->unitab_font + 1, unitab_xterm_std,
sizeof(unitab_xterm_std));
/* Collect OEMCP ucs table */
get_unitab(CP_OEMCP, ucsdata->unitab_oemcp, 1);
/* Collect CP437 ucs table for SCO acs */
if (cfg->vtmode == VT_OEMANSI || cfg->vtmode == VT_XWINDOWS)
memcpy(ucsdata->unitab_scoacs, ucsdata->unitab_oemcp,
sizeof(ucsdata->unitab_scoacs));
else
get_unitab(437, ucsdata->unitab_scoacs, 1);
/* Collect line set ucs table */
if (ucsdata->line_codepage == ucsdata->font_codepage &&
(ucsdata->dbcs_screenfont ||
cfg->vtmode == VT_POORMAN || ucsdata->font_codepage==0)) {
/* For DBCS and POOR fonts force direct to font */
used_dtf = 1;
for (i = 0; i < 32; i++)
ucsdata->unitab_line[i] = (WCHAR) i;
for (i = 32; i < 256; i++)
ucsdata->unitab_line[i] = (WCHAR) (ATTR_ACP + i);
ucsdata->unitab_line[127] = (WCHAR) 127;
} else {
get_unitab(ucsdata->line_codepage, ucsdata->unitab_line, 0);
}
#if 0
debug(
("Line cp%d, Font cp%d%s\n", ucsdata->line_codepage,
ucsdata->font_codepage, ucsdata->dbcs_screenfont ? " DBCS" : ""));
for (i = 0; i < 256; i += 16) {
for (j = 0; j < 16; j++) {
debug(("%04x%s", ucsdata->unitab_line[i + j], j == 15 ? "" : ","));
}
debug(("\n"));
}
#endif
/* VT100 graphics - NB: Broken for non-ascii CP's */
memcpy(ucsdata->unitab_xterm, ucsdata->unitab_line,
sizeof(ucsdata->unitab_xterm));
memcpy(ucsdata->unitab_xterm + '`', unitab_xterm_std,
sizeof(unitab_xterm_std));
ucsdata->unitab_xterm['_'] = ' ';
/* Generate UCS ->line page table. */
if (ucsdata->uni_tbl) {
for (i = 0; i < 256; i++)
if (ucsdata->uni_tbl[i])
sfree(ucsdata->uni_tbl[i]);
sfree(ucsdata->uni_tbl);
ucsdata->uni_tbl = 0;
}
if (!used_dtf) {
for (i = 0; i < 256; i++) {
if (DIRECT_CHAR(ucsdata->unitab_line[i]))
continue;
if (DIRECT_FONT(ucsdata->unitab_line[i]))
continue;
if (!ucsdata->uni_tbl) {
ucsdata->uni_tbl = snewn(256, char *);
memset(ucsdata->uni_tbl, 0, 256 * sizeof(char *));
}
j = ((ucsdata->unitab_line[i] >> 8) & 0xFF);
if (!ucsdata->uni_tbl[j]) {
ucsdata->uni_tbl[j] = snewn(256, char);
memset(ucsdata->uni_tbl[j], 0, 256 * sizeof(char));
}
ucsdata->uni_tbl[j][ucsdata->unitab_line[i] & 0xFF] = i;
}
}
/* Find the line control characters. */
for (i = 0; i < 256; i++)
if (ucsdata->unitab_line[i] < ' '
|| (ucsdata->unitab_line[i] >= 0x7F &&
ucsdata->unitab_line[i] < 0xA0))
ucsdata->unitab_ctrl[i] = i;
else
ucsdata->unitab_ctrl[i] = 0xFF;
/* Generate line->screen direct conversion links. */
if (cfg->vtmode == VT_OEMANSI || cfg->vtmode == VT_XWINDOWS)
link_font(ucsdata->unitab_scoacs, ucsdata->unitab_oemcp, ATTR_OEMCP);
link_font(ucsdata->unitab_line, ucsdata->unitab_font, ATTR_ACP);
link_font(ucsdata->unitab_scoacs, ucsdata->unitab_font, ATTR_ACP);
link_font(ucsdata->unitab_xterm, ucsdata->unitab_font, ATTR_ACP);
if (cfg->vtmode == VT_OEMANSI || cfg->vtmode == VT_XWINDOWS) {
link_font(ucsdata->unitab_line, ucsdata->unitab_oemcp, ATTR_OEMCP);
link_font(ucsdata->unitab_xterm, ucsdata->unitab_oemcp, ATTR_OEMCP);
}
if (ucsdata->dbcs_screenfont &&
ucsdata->font_codepage != ucsdata->line_codepage) {
/* F***ing Microsoft fonts, Japanese and Korean codepage fonts
* have a currency symbol at 0x5C but their unicode value is
* still given as U+005C not the correct U+00A5. */
ucsdata->unitab_line['\\'] = ATTR_OEMCP + '\\';
}
/* Last chance, if !unicode then try poorman links. */
if (cfg->vtmode != VT_UNICODE) {
static const char poorman_scoacs[] =
"CueaaaaceeeiiiAAE**ooouuyOUc$YPsaiounNao?++**!<>###||||++||++++++--|-+||++--|-+----++++++++##||#aBTPEsyt******EN=+><++-=... n2* ";
static const char poorman_latin1[] =
" !cL.Y|S\"Ca<--R~o+23'u|.,1o>///?AAAAAAACEEEEIIIIDNOOOOOxOUUUUYPBaaaaaaaceeeeiiiionooooo/ouuuuypy";
static const char poorman_vt100[] = "*#****o~**+++++-----++++|****L.";
for (i = 160; i < 256; i++)
if (!DIRECT_FONT(ucsdata->unitab_line[i]) &&
ucsdata->unitab_line[i] >= 160 &&
ucsdata->unitab_line[i] < 256) {
ucsdata->unitab_line[i] =
(WCHAR) (ATTR_ACP +
poorman_latin1[ucsdata->unitab_line[i] - 160]);
}
for (i = 96; i < 127; i++)
if (!DIRECT_FONT(ucsdata->unitab_xterm[i]))
ucsdata->unitab_xterm[i] =
(WCHAR) (ATTR_ACP + poorman_vt100[i - 96]);
for(i=128;i<256;i++)
if (!DIRECT_FONT(ucsdata->unitab_scoacs[i]))
ucsdata->unitab_scoacs[i] =
(WCHAR) (ATTR_ACP + poorman_scoacs[i - 128]);
}
}
static void link_font(WCHAR * line_tbl, WCHAR * font_tbl, WCHAR attr)
{
int font_index, line_index, i;
for (line_index = 0; line_index < 256; line_index++) {
if (DIRECT_FONT(line_tbl[line_index]))
continue;
for(i = 0; i < 256; i++) {
font_index = ((32 + i) & 0xFF);
if (line_tbl[line_index] == font_tbl[font_index]) {
line_tbl[line_index] = (WCHAR) (attr + font_index);
break;
}
}
}
}
wchar_t xlat_uskbd2cyrllic(int ch)
{
static const wchar_t cyrtab[] = {
0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 0x042d, 35, 36, 37, 38, 0x044d,
40, 41, 42, 0x0406, 0x0431, 0x0454, 0x044e, 0x002e,
48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 0x0416, 0x0436, 0x0411, 0x0456, 0x042e, 0x002c,
64, 0x0424, 0x0418, 0x0421, 0x0412, 0x0423, 0x0410, 0x041f,
0x0420, 0x0428, 0x041e, 0x041b, 0x0414, 0x042c, 0x0422, 0x0429,
0x0417, 0x0419, 0x041a, 0x042b, 0x0415, 0x0413, 0x041c, 0x0426,
0x0427, 0x041d, 0x042f, 0x0445, 0x0457, 0x044a, 94, 0x0404,
96, 0x0444, 0x0438, 0x0441, 0x0432, 0x0443, 0x0430, 0x043f,
0x0440, 0x0448, 0x043e, 0x043b, 0x0434, 0x044c, 0x0442, 0x0449,
0x0437, 0x0439, 0x043a, 0x044b, 0x0435, 0x0433, 0x043c, 0x0446,
0x0447, 0x043d, 0x044f, 0x0425, 0x0407, 0x042a, 126, 127
};
return cyrtab[ch&0x7F];
}
int check_compose_internal(int first, int second, int recurse)
{
static const struct {
char first, second;
wchar_t composed;
} composetbl[] = {
{
0x2b, 0x2b, 0x0023}, {
0x41, 0x41, 0x0040}, {
0x28, 0x28, 0x005b}, {
0x2f, 0x2f, 0x005c}, {
0x29, 0x29, 0x005d}, {
0x28, 0x2d, 0x007b}, {
0x2d, 0x29, 0x007d}, {
0x2f, 0x5e, 0x007c}, {
0x21, 0x21, 0x00a1}, {
0x43, 0x2f, 0x00a2}, {
0x43, 0x7c, 0x00a2}, {
0x4c, 0x2d, 0x00a3}, {
0x4c, 0x3d, 0x20a4}, {
0x58, 0x4f, 0x00a4}, {
0x58, 0x30, 0x00a4}, {
0x59, 0x2d, 0x00a5}, {
0x59, 0x3d, 0x00a5}, {
0x7c, 0x7c, 0x00a6}, {
0x53, 0x4f, 0x00a7}, {
0x53, 0x21, 0x00a7}, {
0x53, 0x30, 0x00a7}, {
0x22, 0x22, 0x00a8}, {
0x43, 0x4f, 0x00a9}, {
0x43, 0x30, 0x00a9}, {
0x41, 0x5f, 0x00aa}, {
0x3c, 0x3c, 0x00ab}, {
0x2c, 0x2d, 0x00ac}, {
0x2d, 0x2d, 0x00ad}, {
0x52, 0x4f, 0x00ae}, {
0x2d, 0x5e, 0x00af}, {
0x30, 0x5e, 0x00b0}, {
0x2b, 0x2d, 0x00b1}, {
0x32, 0x5e, 0x00b2}, {
0x33, 0x5e, 0x00b3}, {
0x27, 0x27, 0x00b4}, {
0x2f, 0x55, 0x00b5}, {
0x50, 0x21, 0x00b6}, {
0x2e, 0x5e, 0x00b7}, {
0x2c, 0x2c, 0x00b8}, {
0x31, 0x5e, 0x00b9}, {
0x4f, 0x5f, 0x00ba}, {
0x3e, 0x3e, 0x00bb}, {
0x31, 0x34, 0x00bc}, {
0x31, 0x32, 0x00bd}, {
0x33, 0x34, 0x00be}, {
0x3f, 0x3f, 0x00bf}, {
0x60, 0x41, 0x00c0}, {
0x27, 0x41, 0x00c1}, {
0x5e, 0x41, 0x00c2}, {
0x7e, 0x41, 0x00c3}, {
0x22, 0x41, 0x00c4}, {
0x2a, 0x41, 0x00c5}, {
0x41, 0x45, 0x00c6}, {
0x2c, 0x43, 0x00c7}, {
0x60, 0x45, 0x00c8}, {
0x27, 0x45, 0x00c9}, {
0x5e, 0x45, 0x00ca}, {
0x22, 0x45, 0x00cb}, {
0x60, 0x49, 0x00cc}, {
0x27, 0x49, 0x00cd}, {
0x5e, 0x49, 0x00ce}, {
0x22, 0x49, 0x00cf}, {
0x2d, 0x44, 0x00d0}, {
0x7e, 0x4e, 0x00d1}, {
0x60, 0x4f, 0x00d2}, {
0x27, 0x4f, 0x00d3}, {
0x5e, 0x4f, 0x00d4}, {
0x7e, 0x4f, 0x00d5}, {
0x22, 0x4f, 0x00d6}, {
0x58, 0x58, 0x00d7}, {
0x2f, 0x4f, 0x00d8}, {
0x60, 0x55, 0x00d9}, {
0x27, 0x55, 0x00da}, {
0x5e, 0x55, 0x00db}, {
0x22, 0x55, 0x00dc}, {
0x27, 0x59, 0x00dd}, {
0x48, 0x54, 0x00de}, {
0x73, 0x73, 0x00df}, {
0x60, 0x61, 0x00e0}, {
0x27, 0x61, 0x00e1}, {
0x5e, 0x61, 0x00e2}, {
0x7e, 0x61, 0x00e3}, {
0x22, 0x61, 0x00e4}, {
0x2a, 0x61, 0x00e5}, {
0x61, 0x65, 0x00e6}, {
0x2c, 0x63, 0x00e7}, {
0x60, 0x65, 0x00e8}, {
0x27, 0x65, 0x00e9}, {
0x5e, 0x65, 0x00ea}, {
0x22, 0x65, 0x00eb}, {
0x60, 0x69, 0x00ec}, {
0x27, 0x69, 0x00ed}, {
0x5e, 0x69, 0x00ee}, {
0x22, 0x69, 0x00ef}, {
0x2d, 0x64, 0x00f0}, {
0x7e, 0x6e, 0x00f1}, {
0x60, 0x6f, 0x00f2}, {
0x27, 0x6f, 0x00f3}, {
0x5e, 0x6f, 0x00f4}, {
0x7e, 0x6f, 0x00f5}, {
0x22, 0x6f, 0x00f6}, {
0x3a, 0x2d, 0x00f7}, {
0x6f, 0x2f, 0x00f8}, {
0x60, 0x75, 0x00f9}, {
0x27, 0x75, 0x00fa}, {
0x5e, 0x75, 0x00fb}, {
0x22, 0x75, 0x00fc}, {
0x27, 0x79, 0x00fd}, {
0x68, 0x74, 0x00fe}, {
0x22, 0x79, 0x00ff},
/* Unicode extras. */
{
0x6f, 0x65, 0x0153}, {
0x4f, 0x45, 0x0152},
/* Compose pairs from UCS */
{
0x41, 0x2D, 0x0100}, {
0x61, 0x2D, 0x0101}, {
0x43, 0x27, 0x0106}, {
0x63, 0x27, 0x0107}, {
0x43, 0x5E, 0x0108}, {
0x63, 0x5E, 0x0109}, {
0x45, 0x2D, 0x0112}, {
0x65, 0x2D, 0x0113}, {
0x47, 0x5E, 0x011C}, {
0x67, 0x5E, 0x011D}, {
0x47, 0x2C, 0x0122}, {
0x67, 0x2C, 0x0123}, {
0x48, 0x5E, 0x0124}, {
0x68, 0x5E, 0x0125}, {
0x49, 0x7E, 0x0128}, {
0x69, 0x7E, 0x0129}, {
0x49, 0x2D, 0x012A}, {
0x69, 0x2D, 0x012B}, {
0x4A, 0x5E, 0x0134}, {
0x6A, 0x5E, 0x0135}, {
0x4B, 0x2C, 0x0136}, {
0x6B, 0x2C, 0x0137}, {
0x4C, 0x27, 0x0139}, {
0x6C, 0x27, 0x013A}, {
0x4C, 0x2C, 0x013B}, {
0x6C, 0x2C, 0x013C}, {
0x4E, 0x27, 0x0143}, {
0x6E, 0x27, 0x0144}, {
0x4E, 0x2C, 0x0145}, {
0x6E, 0x2C, 0x0146}, {
0x4F, 0x2D, 0x014C}, {
0x6F, 0x2D, 0x014D}, {
0x52, 0x27, 0x0154}, {
0x72, 0x27, 0x0155}, {
0x52, 0x2C, 0x0156}, {
0x72, 0x2C, 0x0157}, {
0x53, 0x27, 0x015A}, {
0x73, 0x27, 0x015B}, {
0x53, 0x5E, 0x015C}, {
0x73, 0x5E, 0x015D}, {
0x53, 0x2C, 0x015E}, {
0x73, 0x2C, 0x015F}, {
0x54, 0x2C, 0x0162}, {
0x74, 0x2C, 0x0163}, {
0x55, 0x7E, 0x0168}, {
0x75, 0x7E, 0x0169}, {
0x55, 0x2D, 0x016A}, {
0x75, 0x2D, 0x016B}, {
0x55, 0x2A, 0x016E}, {
0x75, 0x2A, 0x016F}, {
0x57, 0x5E, 0x0174}, {
0x77, 0x5E, 0x0175}, {
0x59, 0x5E, 0x0176}, {
0x79, 0x5E, 0x0177}, {
0x59, 0x22, 0x0178}, {
0x5A, 0x27, 0x0179}, {
0x7A, 0x27, 0x017A}, {
0x47, 0x27, 0x01F4}, {
0x67, 0x27, 0x01F5}, {
0x4E, 0x60, 0x01F8}, {
0x6E, 0x60, 0x01F9}, {
0x45, 0x2C, 0x0228}, {
0x65, 0x2C, 0x0229}, {
0x59, 0x2D, 0x0232}, {
0x79, 0x2D, 0x0233}, {
0x44, 0x2C, 0x1E10}, {
0x64, 0x2C, 0x1E11}, {
0x47, 0x2D, 0x1E20}, {
0x67, 0x2D, 0x1E21}, {
0x48, 0x22, 0x1E26}, {
0x68, 0x22, 0x1E27}, {
0x48, 0x2C, 0x1E28}, {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -