下一页 上一页 目录

12. 如何使其他程序能够处理非 ASCII 字符

在过去糟糕的日子里,这曾经非常麻烦。每个单独的程序都必须被单独说服以保留您的位。现在虽然并非一切都很容易,但最近许多 gnu 实用程序已经学会对 LC_CTYPE=iso_8859_1LC_CTYPE=iso-8859-1 做出反应。首先尝试这个,如果它没有帮助,请查看下面的提示。请注意,在 libc 的最新版本中,只有在您安装了区域设置文件(例如在 /usr/lib/locale 中)后,例程 setlocale() 才能工作。

首先,第 8 位应该在内核输入处理中幸存下来,因此请确保设置了 stty cs8 -istrip -parenb

A. 对于 emacs,细节在很大程度上取决于版本。以下信息适用于 19.34 版本。将以下行放入您的 $HOME/.emacs 中。

        (set-input-mode nil nil 1)
        (standard-display-european t)
        (require 'iso-syntax)
放入您的 $HOME/.emacs。第一行(准确地说:最后一个 1)告诉 emacs 不要丢弃来自输入字符的第 8 位。第二行告诉 emacs 不要将非 ASCII 字符显示为八进制转义符。第三行指定 Latin-1 字符集的语法属性和大小写转换表。如果您在您的环境中有类似 LC_CTYPE=ISO-8859-1 的内容,则最后两行是多余的。(变量也可能是 LC_ALL 甚至 LANG。该值可以是任何带有子字符串“88591”或“8859-1”或“8859_1”的内容。)

这是一个好的开始。在无法显示非 ASCII ISO 8859-1 符号的终端上,命令

        (load-library "iso-ascii")
将导致重音字符显示为 comme {,c}a。如果您的键盘映射不容易生成非 ASCII 字符,那么
        (load-library "iso-transl")
将使双字符序列 Ctrl-X 8 成为组合字符,以便四字符序列 Ctrl-X 8 , c 生成 c-cedilla。非常不方便。

命令

        (iso-accents-mode)
将切换 ISO-8859-1 重音模式,在该模式下,六个字符 ', `, ", ^, ~, / 是死键,用于修改后面的符号。特殊组合:~c 给出带 cedilla 的 c,~d 给出冰岛语 eth,~t 给出冰岛语 thorn,"s 给出德语 sharp s,/a 给出带环的 a,/e 给出 a-e 连字,~< 和 ~> 给出书名号,~! 给出倒感叹号,~? 给出倒问号,'' 给出锐音符。这是重音的默认映射。变量 iso-languages 是(语言名称,重音映射)对的列表,可以使用
        (iso-accents-customize LANGUAGE)
在这里,LANGUAGE 可以是 "portuguese""irish""french""latin-2""latin-1" 之一。

由于 Linux 默认的组合字符是 Ctrl-.,因此在任何地方都使用它可能很方便。尝试

        (load-library "iso-insert.el")
        (define-key global-map [?\C-.] 8859-1-map)
后一行在 xterm 下不起作用,如果您使用 emacs -nw,但在这种情况下,您可以将
        XTerm*VT100.Translations:       #override\n\
              Ctrl <KeyPress> . : string("\0308")
放入您的 .Xresources 中。)

B. 对于 less,将 LESSCHARSET=latin1 放入环境中。如果您在 man 输出中看到 \255<AD>,这也是您需要的:某些版本的 less 在未被允许输出 Latin-1 时,会以这种方式渲染软连字符(八进制 0255,十六进制 0xAD)。

C. 对于 ls,给出选项 -N。(可能您想创建一个别名。)

D. 对于 bash(1.13.* 版本),将

        set meta-flag on
        set convert-meta off
        set output-meta on
放入您的 $HOME/.inputrc 中。

E. 对于 tcsh,使用

        setenv LANG     US_en
        setenv LC_CTYPE iso_8859_1
如果您的系统上有 nls,则使用相应的例程。否则,tcsh 将假定 iso_8859_1,而不管赋予 LANG 和 LC_CTYPE 的值。请参阅 tcsh(1) 中的 NATIVE LANGUAGE SYSTEM 部分。(丹麦语 HOWTO 说:setenv LC_CTYPE ISO-8859-1; stty pass8

F. 对于 flex,如果它生成的解析器必须能够处理 8 位输入,则给出选项 -8。(当然必须能够处理。)

G. 对于 elm,将 displaycharset 设置为 ISO-8859-1。(丹麦语 HOWTO:LANG=CLC_CTYPE=ISO-8859-1

H. 对于使用 curses 的程序(例如 lynx),David Sibley 报告:常规 curses 包使用高位用于反向视频模式(请参阅 /usr/include/curses.h 中定义的标志 _STANDOUT)。但是,ncurses 似乎是 8 位干净的,并且可以正确显示 iso-latin-8859-1。

I. 对于使用 groff 的程序(例如 man),请确保使用 -Tlatin1 而不是 -Tascii。旧版本的程序 man 也使用 col,并且以下几点也适用。

J. 对于 col,请确保 1) 对其进行修复以执行 setlocale(LC_CTYPE,""); 和 2) 将 LC_CTYPE=ISO-8859-1 放入环境中。

K. 对于 rlogin,使用选项 -8

L. 对于 joe,据说 metalab.unc.edu:/pub/Linux/apps/editors/joe-1.0.8-linux.tar.gz 在编辑配置文件后可以工作。其他人说:joe:将 -asis 选项放在 /isr/lib/joerc 中的第一列。

M. 对于 LaTeX:\documentstyle[isolatin]{article}。对于 LaTeX2e:\documentclass{article}\usepackage{isolatin},其中 isolatin.sty 可从 ftp.vlsivie.tuwien.ac.at/pub/8bit 获取。

grasp.insa-lyon.fr:/pub/faq/fr/accents 文件(法语)中包含关于 ISO-8859-1 以及如何管理 8 位字符的精彩讨论。另一个精彩的讨论(英语)可以在 rtfm.mit.edu:pub/usenet-by-group/comp.answers/internationalization/iso-8859-1-charset 中找到。

如果您需要修复一个在 8 位字符方面表现不佳的程序,需要记住的一件事是,如果您有一个有符号的 char 类型,那么字符可能是负数,并且将它们用作数组索引将会失败。通过明智地添加 (unsigned char) 强制转换,可以修复多个程序。


下一页 上一页 目录