UTF.COM.CN

UTF-8编码的详细讲解

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

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

文件名  
标准输入与标准输出, 管道  
环境变量  
剪切与粘贴选择缓冲区  
telnet, modem 和到终端模拟器的串口连接  
以及其他地方以前用ASCII来表示的字节串  
在 UTF-8 模式下, 终端模拟器, 比如 xterm 或 Linux console driver, 将每次按键转换成相应的 UTF-8 串, 然后发送到前台进程的 stdin 里. 类似的, 任何进程在 stdout 上的输出都将发送到终端模拟器, 在那里用一个 UTF-8 解码器进行处理, 之后再用一种 16 位的字体显示出来. 

只有在功能完善的多语言字处理器包里才可能有完全的 Unicode 功能支持. 而广泛用在 Linux 里用于取代 ASCII 和其他 8 位字符集的方案则要简单得多. 第一步, Linux 终端模拟器和命令行工具将只是转变到 UTF-8. 这意味着只用到 级别1 的 ISO 10646-1 实现 (没有组合字符), 且只支持那些不需要更多处理的语言象 拉丁, 希腊, 斯拉夫 和许多科学用符号. 在这个级别上, UCS 支持与 ISO 8859 支持类似, 唯一显著的区别是现在我们有几千种字符可以用了, 其中的字符可以用多字节串来表示. 

总有一天 Linux 会当然地支持组合字符, 但即便如此, 对于组合字符串, 预作字符(如何可用的话)仍将是首选的. 更正式地, 在 Linux 下用 Unicode 对文本编码的首选的方法应该是定义在 Unicode Technical Report #15 里的 Normalization Form C. 

在今后的一个阶段, 人们可以考虑增加在日文和中文里用到的双字节字符的支持 (他们相对比较简单), 组合字符支持, 甚至也许对从右至左书写的语言如希伯来文 (他们可不是那么简单的) 的支持. 但对这些高级功能的支持不应该阻碍简单的平板 UTF-8 在 拉丁, 希腊, 斯拉夫和科学用符号方面的快速应用, 以取代大量的欧洲 8 位编码, 并提供一个象样的科学用符号集. 

我该怎样修改我的软件? 
有两种途径可以支持 UTF-8, 我称之为软转换与硬转换. 软转换时, 各处的数据均保存为 UTF-8 形式, 因而需要修改的软件很少. 在硬转换时, 程序将读入的 UTF-8 数据转换成宽字符数组, 以在应用程序内部处理. 在输出时, 再把字符串转换回 UTF-8 形式. 

大多数应用程序只用软转换就可以工作得很好了. 这使得将 UTF-8 引入 Unix 成为切实可行的. 例如, 象 cat 和 echo 这样的程序根本不需要修改. 他们仍然可以对输入输出的是 ISO 8859-2 还是 UTF-8 一无所知, 因为它们只是搬运字节流而没有处理它们. 它们只能识别 ASCII 字符和象 ’\n’ 这样的控制码, 而这在 UTF-8 下也没有任何改变. 因此, 这些应用程序的 UTF-8 编码与解码将完全在终端模拟器里完成. 

而那些通过数字节数来获知字符数量的程序则需要一些小修改. 在 UTF-8 模式下, 它们必须不数入 0x80 到 0xBF 范围内的字节, 因为这些只是跟随字节, 它们本身并不是字符. 例如, ls 程序就必须要修改, 因为它通过数文件名中字符数来排放给用户的目录表格布局. 类似地, 所有的假定其输出为定宽字体, 并因此而格式化它们的程序, 必须学会怎样数 UTF-8 文本中的字符数. 编辑器的功能, 如删除单个字符, 必须要作轻微的修改, 以删除可能属于该字符的所有字节. 受影响有编辑器 (vi,emacs, 等等)以及使用 ncurses 库的程序. 

Linux 核心使用软转换也可以工作得很好, 只需要非常微小的修改以支持 UTF-8. 大多数处理字符串的核心功能 (例如: 文件名, 环境变量, 等等) 都不受影响. 下列地方也许必须修改:  

控制台显示与键盘驱动程序 (另一个 VT100 模拟器) 必须能编码和解码 UTF-8, 必须要起码支持 Unicode 字符集的几个子集. 从 Linux 1.2 起这些功能已经有了.  
外部文件系统驱动程序, 例如 VFAT 和 WinNT 必须转换文件名字符编码. UTF-8 已经加入可用的转换选项的列表里了, 因此 mount 命令必须告诉核心驱动程序用户进程希望看到 UTF-8 文件名. 既然 VFAT 和 WinNT 无论如何至少已经用了 Unicode了, 那么 UTF-8 在这里就可以发挥其优势, 以保证转换中无信息损失. 
责任编辑:冬天来了
【字号: 】【去论坛讨论】【发表评论】【打印本文】【告诉好友】【关闭窗口
网友评论(评论内容只代表网友观点,与本站立场无关!)
  • 的 发表于: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。

姓名:

验证码: 点击刷新