Markus Kuhn's UTF-8 page
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 16 Oct 2004 14:17:58 +0000 (14:17 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 16 Oct 2004 14:17:58 +0000 (14:17 +0000)
  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: svn://svn.tartarus.org/sgt/putty@4648 cda61777-01e9-0310-a592-d414129be87e

putty.h
settings.c
unix/pterm.c
unix/unix.h
unix/uxcfg.c
unix/uxucs.c

diff --git a/putty.h b/putty.h
index 89889b9..a7f3f5b 100644 (file)
--- a/putty.h
+++ b/putty.h
@@ -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;
index b0f223e..a8f7091 100644 (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);
index ec1ffec..13cd994 100644 (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);
 }
 
index f12f576..384789a 100644 (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.
index 813009e..fff2968 100644 (file)
@@ -130,6 +130,21 @@ void unix_setup_config_box(struct controlbox *b, int midsession, void *win)
                  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.
      */
index 601b35d..8359553 100644 (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