Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1444906
  • 博文数量: 295
  • 博客积分: 10051
  • 博客等级: 上将
  • 技术积分: 3850
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-11 08:50
文章分类

全部博文(295)

文章存档

2011年(1)

2009年(4)

2008年(290)

我的朋友

分类: 系统运维

2008-04-19 15:06:40

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

新的支持 UTF-8 的 xterm 版本, 以及一些 ISO 10646-1 字体, 将被收录入 XFree86 4.0 版里. 

xterm 支持组合字符吗? 
Xterm 当前只支持级别1的 ISO 10646-1, 就是说, 不提供组合字符的支持. 当前, 组合字符将被当作空格字符对待. xterm 将来的修订版很有可能加入某些简单的组合字符支持, 就是仅仅将那个有一个或多个组合字符的基字符加粗 (logical OR-ing). 对于在基线以下的和在小字符上方的重音符来说, 这样处理的结果还是可以接受的. 对于象泰国文字体那样使用特别设计的加粗字符的文字, 这样处理也能工作的很好. 然而, 对于某些字体里, 在较高的字符上方组合上的重音符, 特别是对于 "fixed" 字体族, 产生的结果就不完全令人满意了. 因此, 在可用的地方, 应该继续优先使用预作字符. 

xterm 支持半宽与全宽 CJK 字体吗? 
Xterm 当前只支持那种所有字形都等宽的 cell-spaced 的字体. 将来的修订版很有可能为 CJK 语言加入半宽与全宽字符支持, 类似于 kterm 提供的那种. 如果选择的普通字体是 X×Y 象素大小, 且宽字符模式是打开的, 那么 xterm 会试图装入另外的一个 2X×Y 象素大小的字体 (同样的 XLFD, 只是 AVERAGE_WIDTH 属性的值翻倍). 它会用这个字体来显示所有在 Unicode Technical Report #11 里被分配了East Asian Wide (W) 或 East Asian FullWidth (F) 宽度属性的 Unicode 字符. 下面这个 C 函数用来测试一个 Unicode 字符是否是宽字符并需要用覆盖两个字符单元的字形来显示: 

/* This function tests, whether the ISO 10646/Unicode character code 
  * ucs belongs into the East Asian Wide (W) or East Asian FullWidth 
  * (F) category as defined in Unicode Technical Report #11. In this 
  * case, the terminal emulator should represent the character using a 
  * a glyph from a double-wide font that covers two normal (Latin) 
  * character cells. */ 

int iswide(int ucs) 

  if (ucs < 0x1100) 
    return 0; 

  return 
    (ucs >= 0x1100 && ucs <= 0x115f) || /* Hangul Jamo */ 
    (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & ~0x0011) != 0x300a && 
    ucs != 0x303f) ||               /* CJK ... Yi */ 
    (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ 
    (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ 
    (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ 
    (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */ 
    (ucs >= 0xffe0 && ucs <= 0xffe6); 

某些 C 库也提供了函数 

#include  
int wcwidth(wchar_t wc); 
int wcswidth(const wchar_t *pwcs, size_t n); 
用来测定该宽字符 wc 或由 pwcs 指向的字符串中的 n 个宽字符码 (或者少于 n 个宽字符码, 如果在 n 个宽字符码之前遇到一个空宽字符的话) 所要求的列位置的数量. 这些函数定义在 Open Group 的 Single UNIX Specification 里. 一个拉丁/希腊/斯拉夫/等等的字符要求一个列位置, 一个 CJK 象形文字要求两个, 而一个组合字符要求零个. 

最终 xterm 是否会支持从右到左的书写? 
此刻还没有给 xterm 增加从右到左功能的计划. 希伯来与阿拉伯用户因此不得不靠应用程序在将希伯来文与阿拉伯文字符串送到终端前按左方向翻转它们, 换句话说, 双向处理必须在应用程序里完成, 而不是在 xterm 里. 至少, 希伯来与阿拉伯文在预作字形的可用性的形式上, 以及提示表格上的支持, 比 ISO 8859 要有所改进. 现在还远没有决定 xterm 是否支持双向文字以及该怎样工作. ISO 6429 = ECMA-48 和 Unicode bidi algorithm 都提供了可供选择的开始点. 也可以参考 ECMA Technical 
Report TR/53. Xterm 也不处理阿拉伯文, Hangul 或 印度文本的格式化算法, 而且现在还不太清楚在 VT100 模拟器里处理是否可行和值得, 或者应该留给应用软件去处理. 如果你打算在你的应用程序里支持双向文字输出, 看一下 FriBidi, Dov Grobgeld 的 Unicode 双向算法的自由实现.
阅读(1193) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~