1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 01:48:00 +00:00

Markus Kuhn's UTF-8 page

http://www.cl.cam.ac.uk/~mgk25/unicode.html#activate
feels strongly that it should be easy to make _all_ your
applications work in UTF-8 mode, without having to remember a switch
for each one. Every application should simply note a UTF-8 locale
setting and switch into UTF-8 mode automatically.

Therefore, for the Unix port only, there's now a checkbox, enabled
by default, which causes the drop-down Translation box to be
overridden if the locale indicates UTF-8. Anyone who doesn't like
this, or doesn't like MGK, is welcome to turn it straight back off.

I'm not _completely_ convinced by MGK's argument myself; for
xterm/pterm to do _useful_ UTF-8 you also need to specify a decently
Unicode-capable font, and there's no way _that_ can be automagically
done on noticing a locale setting. But it's a de facto standard
(i.e. xterm does it :-) so I might as well at least be _able_ to
support it.

[originally from svn r4648]
This commit is contained in:
Simon Tatham 2004-10-16 14:17:58 +00:00
parent d412fed542
commit 1b3eb3e20d
6 changed files with 44 additions and 9 deletions

View File

@ -448,6 +448,7 @@ struct config_tag {
/* translations */
int vtmode;
char line_codepage[128];
int utf8_override;
int xlat_capslockcyr;
/* X11 forwarding */
int x11_forward;

View File

@ -314,6 +314,7 @@ void save_open_settings(void *sesskey, int do_host, Config *cfg)
write_setting_s(sesskey, buf, buf2);
}
write_setting_s(sesskey, "LineCodePage", cfg->line_codepage);
write_setting_i(sesskey, "UTF8Override", cfg->utf8_override);
write_setting_s(sesskey, "Printer", cfg->printer);
write_setting_i(sesskey, "CapsLockCyr", cfg->xlat_capslockcyr);
write_setting_i(sesskey, "ScrollBar", cfg->scrollbar);
@ -608,6 +609,7 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
*/
gpps(sesskey, "LineCodePage", "", cfg->line_codepage,
sizeof(cfg->line_codepage));
gppi(sesskey, "UTF8Override", 1, &cfg->utf8_override);
gpps(sesskey, "Printer", "", cfg->printer, sizeof(cfg->printer));
gppi (sesskey, "CapsLockCyr", 0, &cfg->xlat_capslockcyr);
gppi(sesskey, "ScrollBar", 1, &cfg->scrollbar);

View File

@ -2737,8 +2737,8 @@ void setup_fonts_ucs(struct gui_data *inst)
inst->font_width = gdk_char_width(inst->fonts[0], ' ');
inst->font_height = inst->fonts[0]->ascent + inst->fonts[0]->descent;
inst->direct_to_font = init_ucs(&inst->ucsdata,
inst->cfg.line_codepage, font_charset,
inst->direct_to_font = init_ucs(&inst->ucsdata, inst->cfg.line_codepage,
inst->cfg.utf8_override, font_charset,
inst->cfg.vtmode);
}

View File

@ -118,8 +118,8 @@ void (*putty_signal(int sig, void (*func)(int)))(int);
* Exports from unicode.c.
*/
struct unicode_data;
int init_ucs(struct unicode_data *ucsdata,
char *line_codepage, int font_charset, int vtmode);
int init_ucs(struct unicode_data *ucsdata, char *line_codepage,
int utf8_override, int font_charset, int vtmode);
/*
* Spare function exported directly from uxnet.c.

View File

@ -129,6 +129,21 @@ void unix_setup_config_box(struct controlbox *b, int midsession, void *win)
HELPCTX(no_help), dlg_stdeditbox_handler,
I(offsetof(Config,shadowboldoffset)), I(-1));
/*
* Markus Kuhn feels, not totally unreasonably, that it's good
* for all applications to shift into UTF-8 mode if they notice
* that they've been started with a LANG setting dictating it,
* so that people don't have to keep remembering a separate
* UTF-8 option for every application they use. Therefore,
* here's an override option in the Translation panel.
*/
s = ctrl_getset(b, "Window/Translation", "trans",
"Character set translation on received data");
ctrl_checkbox(s, "Override with UTF-8 if locale says so", 'l',
HELPCTX(translation_utf8_override),
dlg_stdcheckbox_handler,
I(offsetof(Config,utf8_override)));
/*
* Unix supports a local-command proxy. This also means we must
* adjust the text on the `Telnet command' control.

View File

@ -106,8 +106,8 @@ int wc_to_mb(int codepage, int flags, wchar_t *wcstr, int wclen,
/*
* Return value is TRUE if pterm is to run in direct-to-font mode.
*/
int init_ucs(struct unicode_data *ucsdata,
char *linecharset, int font_charset, int vtmode)
int init_ucs(struct unicode_data *ucsdata, char *linecharset,
int utf8_override, int font_charset, int vtmode)
{
int i, ret = 0;
@ -120,10 +120,27 @@ int init_ucs(struct unicode_data *ucsdata,
ucsdata->font_codepage = -1;
/*
* line_codepage should be decoded from the specification in
* cfg.
* If utf8_override is set and the POSIX locale settings
* dictate a UTF-8 character set, then just go straight for
* UTF-8.
*/
ucsdata->line_codepage = decode_codepage(linecharset);
ucsdata->line_codepage = CS_NONE;
if (utf8_override) {
const char *s;
if (((s = getenv("LC_ALL")) && *s) ||
((s = getenv("LC_CTYPE")) && *s) ||
((s = getenv("LANG")) && *s)) {
if (strstr(s, "UTF-8"))
ucsdata->line_codepage = CS_UTF8;
}
}
/*
* Failing that, line_codepage should be decoded from the
* specification in cfg.
*/
if (ucsdata->line_codepage == CS_NONE)
ucsdata->line_codepage = decode_codepage(linecharset);
/*
* If line_codepage is _still_ CS_NONE, we assume we're using