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.
git-svn-id: http://svn.tartarus.org/sgt/putty@4648
cda61777-01e9-0310-a592-
d414129be87e
/* translations */
int vtmode;
char line_codepage[128];
+ int utf8_override;
int xlat_capslockcyr;
/* X11 forwarding */
int x11_forward;
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);
*/
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);
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);
}
* 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.
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.
/*
* 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;
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