UTF.COM.CN

UTF-8编码的详细讲解

作者:佚名 | 来源:网络 | 添加时间:2006-02-22 11:19:18 | 人气:75914

UTF-8编码的详细讲解(5)

POSIX 系统的 tty 驱动程序支持一种 "cooked" 模式, 有一些原始的行编辑功能. 为了让字符删除功能工作正常, stty 必须在 tty 驱动程序里设置 UTF-8 模式, 因此它就不会把 0x80 到 0xBF 范围内的跟随字符也数进去了. Bruno Haible 那里已经有了一些 stty 和核心 tty 驱动 程序的 Linux 补丁 了.  
C 对 Unicode 和 UTF-8 的支持 
从 GNU glibc 2.1 开始, wchar_t 类型已经正式定为只存放独立于当前 locale 的, 32位的 ISO 10646 值. glibc 2.2 开始将完全支持 ISO C 中的多字节转换函数 (wprintf(),mbstowcs(),等等), 这些函数可以用于在 wchar_t 和包括 UTF-8 在内的任何依赖于 locale 的多字节编码间进行转换. 

例如, 你可以写 

wprintf(L"Sch鰊e Gre!\n"); 
然后, 你的软件将按照你的用户在环境变量 LC_CTYPE (例如, en_US.UTF-8 或 de_DE.ISO_8859-1) 中选择的 locale 所指定的编码来打印这段文字. 你的编译器必须运行在与该 C 源文件所用编码相应的 locale 中, 在目标文件中以上的宽字符串将改为 wchar_t 字符串存储. 在输出时, 运行时库将把 wchar_t 字符串转换回与程序执行时的 locale 相应的编码. 

注意, 类似这样的操作: 

char c = L"a";  
只允许从 U+0000 到 U+007F (7 位 ASCII) 范围里的字符. 对于非 ASCII 字符, 不能直接从 wchar_t 到 char 转换. 

现在, 象 readline() 这样的函数在 UTF-8 locale 下也能工作了. 

怎样激活 UTF-8 模式? 
如果你的应用程序既支持 8 位字符集 (ISO 8859-*,KOI-8,等等), 也支持 UTF-8, 那么它必须通过某种方法以得知是否应使用 UTF-8 模式. 幸运的是, 在未来的几年里, 人们将只使用 UTF-8, 因此你可以将它作为默认, 但即使如此, 你还是得既支持传统 8 位字符集, 也支持 UTF-8. 

当前的应用程序使用许许多多的不同的命令行开关来激活它们各自的 UTF-8 模式, 例如:  

xterm 命令行选项 "-u8" 和 X resource "XTerm*utf8:1"  
gnat/gcc 命令行选项 "-gnatW8"  
stty 命令行选项 "iutf8"  
mined 命令行选项 "-U"  
xemacs elisp 包裹 以在 UTF-8 和内部使用的 MULE 编码间转换  
vim ’fileencoding’ 选项  
less 环境变量 LESSCHARSET=utf-8  
记住每一个应用程序的命令行选项或其他配置方法是非常单调乏味的, 因此急需某种标准方法. 

如果你在你的应用程序里使用硬转换, 并使用某种特定的 C 库函数来处理外部字符编码和内部使用的 wchar_t 编码的转换工作, 那么 C 库会帮你处理模式切换的问题. 你只需将环境变量 LC_CTYPE 设为正确的 locale, 例如, 如果你使用 UTF-8, 那就是en.UTF-8, 而如果是 Latin-1, 并需要英语的转换, 则设为 en.ISO_8859-1. 

然而, 大多数现存软件的维护者选择用软转换来代替, 而不使用 libc 的宽字符函数, 不仅因为它们还未得到广泛应用, 还因为这会使得软件进行大规模修改. 在这种情况下, 你的应用程序必须自己来获知何时使用 UTF-8 模式. 一种方式是做以下工作: 

按照环境变量 LC_ALL, LC_CTYPE, LANG 的顺序, 寻找第一个有值的变量. 如果该值包含 UTF-8 子串 (也许是小写或没有"-") 则默认为 UTF-8 模式 (仍然可以用命令行开关来重设), 因为这个值可靠又恰当地指示了 C 库应该使用一种 UTF-8 locale. 

提供一个命令行选项 (或者如果是 X 客户程序则用 X resource 的值) 将仍然是有用的, 可以用来重设由 LC_CTYPE 等环境变量指定的默认值. 

我怎样才能得到 UTF-8 版本的 xterm? 
在 XFree86 里带的 xterm 版本最近已经由 Thomas E. Dickey 加入了支持 UTF-8 的扩展. 使用方法是, 获取 xterm patch #119 (1999-10-16) 或更新版本, 用 "./configure --enable-wide-chars ; make" 来编译, 然后用命令行选项 -u8 来调用 xterm, 使它将输入输出转换为 UTF-8. 在 UTF-8 模式里使用一个 *-ISO10646-1 字体. 当你在 ISO 8859-1 模式里时也可以使用 *-ISO10646-1 字体, 因为 ISO 10646-1 字体与 ISO 8859-1 字体是完全向后兼容的. 
责任编辑:冬天来了
【字号: 】【去论坛讨论】【发表评论】【打印本文】【告诉好友】【关闭窗口
网友评论(评论内容只代表网友观点,与本站立场无关!)
  • 的 发表于:2008-03-28 11:43:56
    点击进入与“UTF-8编码的详细讲解”相关的网站
  • 流氓 发表于:2008-03-28 11:43:14
    流氓

    [url="http://www.liumang.com/"]流氓[/url]

    <A href=http://www.liumang.com/>流氓</a>

    <A href="http://www.liumang.com/">流氓</a>

  • s 发表于:2008-03-05 14:24:07
    s
  • 天外来客 发表于:2007-11-30 18:03:27
    最终, Unicode 将取代所有这些编码, 主要通过 UTF-8 的形式?事实上unicode编码方式用的越来越广泛。
  • 天外来客 发表于:2007-11-30 18:01:57
    gb2312编码过于随便,而gb18030对未了向前兼容也只能仍然“随便”
  • 柜体 发表于:2007-10-29 16:37:58
    多幅随风倒撒
  • celsl 发表于:2007-10-29 16:36:38
    ceshi 游戏测试
  • xxxxx 发表于:2007-07-04 15:24:10
    vxvxcvxcv
  • 路过 发表于:2006-09-08 11:25:48
    德语中的元音变音是指 “A“上面加横着排列的两点,用于标识读音的变化,加两点的这个“动作字符“离开相应的字母单独显示也没有意义,这也是一个combining charactor。
  • 路过 发表于:2006-09-08 11:20:33
    这种科技文献的翻译确实很难,最搞笑的莫过于“汉语拼音(Bopomofo)“了,老外的造字术倒是很简洁。关于“什么是组合字符?”写一点注记。“编码点”是指那些待分配的编码、那些UCS位置。“无间隔重音”就是指英语音标表示重音的那一撇,它不单独占一格,而是和相应的字符紧挨在一起的,它只是一个标记不单独显示为一个字符,UCS和旧编码中都有单独的编码用来表示例如 “`A”这种情况,也就是有一组编码逐一列出所有的情况,这些编码对应的字符叫“预作字符”, “`A”作为一个整体保存的,这样当然不够方便,所以UCS另外给出了一种表示方法把重音符号从加重的预作字符里分离出来,使用时加以组合,这种被分离出来的符号统称为(除了重音符号还有下面提到的“变音符号”)“组合字符”(combining charactor),"组合字符”的译法我个人有保留意见,太简单化,combining charactor这个概念其实很特殊化和生僻,这种简单的直译容易让人误解。 “正字法”有一个同义词叫“缀音法”,我认为应该采用这个词更易于理解什么是combining charactor。

姓名:

验证码: 点击刷新