最近,开始了Linux的移植工作,即将windows下开发的win32程序移植到Linux下面。在移植过程中,被宽字符和Unicode的转换折腾了半天,最终成功移植。下面将查到的资料和自己的一些总结做如下说明:
       首先,简单的介绍一下Unicode的概要。
        Unicode 通常用作涉及双字节字符编码方案的通用术语。Unicode CCS 3.1 的官方称谓是 ISO10646-1 通用多八字节编码字符集(Universal Multiple Octet Coded Character Set,UCS)。Unicode 3.1 版本添加了 44,946 个新的编码字符。算上 Unicode 3.0 版本已经存在的 49,194 个字符,共计 94,140 个。   
        UNIX 中,使用得最多的字符编码方案是 UTF-8。 它考虑到了对整个 Unicode 全部页和平面的全面支持,而且它仍能正确的识别 ASCII。除了 UTF-8 的其他选择还有:UCS-4、UTF-16、UTF-7.5、UTF-7、SCSU、HTML 和 JAVA。
Unicode 转换格式(Unicode Transformation Formats,UTFs)是一种通过映射多字节编码中的值来支持 Unicode 的字符编码方案。本文将分析最流行的格式 ― UTF-8 字符编码系统。
         UT F-8
         UTF-8 转换格式正逐步成为一种占主导地位的交换国际文本信息的方法,因为它可以支持世界上所有的语言,而且它还与 ASCII 兼容。UTF-8 使用变长编码。从 0 到 0x7f(127)的字符把自身编码成单字节,而将值更大的字符编码成 2 到 6 个字节。
        
         有两种方法可以将 UTF-8 支持添加到 Linux 应用程序中。第一种方法,数据都以 UTF-8 形式存放在各处,这样软件改动很少(被动的)。另一种方法,被读取的 UTF-8 数据用标准的 C 语言库函数转变成为宽字符数组(转换的)。在输出时,用函数 wcsrtombs() 使字符串被转变回 UTF-8:

清单 1. wcsrtombs()
#include <wchar.h> 
size_t wcsrtombs (char *dest, const wchar_t **src, size_t len, mbstate_t *ps);
方法的选择取决于应用程序的性质。大多数应用程序可以使用被动的方法操作。这就是在 UNIX 平台上使用 UTF-8 会如此流行的原因。像 catecho 那样的程序就不需要修改。字节流仍只是字节流,并没有对它进行任何处理。ASCII 字符和控制代码在 UTF-8 语言环境中不改变。
 
通过字节计数对字符进行计数的程序需要一些小小的改动。在 UTF-8 中应用程序不对任何扩展的字节进行计数。如果选择了 UTF-8 语言环境,C 语言库的 strlen(s) 函数需要用 mbstowcs() 函数来代替:

清单 2. mbstowcs() 函数
#include <stdlib.h>
size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n);
strlen 的一种常见用法是估算显示宽度。中文和其它表意符号将占用两列位置。 wcwidth() 函数用来测试每个字符的显示宽度:

清单 3. wcwidth() 函数
#include <
        wchar.h> 
int wcwidth(wchar_t wc);
其次,介绍我个人的总结