感谢支持
我们一直在努力

Linux下Unicode的使用实践笔记

最近,开始了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 字符编码系统。


UTF-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 会如此流行的原因。像 cat 和 echo 那样的程序就不需要修改。字节流仍只是字节流,并没有对它进行任何处理。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);


其次,介绍我个人的总结。


我的移植内容是在linux下寻找和windows API函数MultiByteToWideChar功类似的函数,从网上查的有函数size_t mbstowcs(wchar_t *dest, const char *src, size_t n);该函数在对普通字符进行转换时没有问题,但是如果碰上汉字,则总是返回长度-1,即转换失败。其实从man手册中可以看到,如果src字符串是当前系统格式不能够表示时,就返回-1。为了能够对汉字也可以进行转换,需要设置Linux当前编程中的字符集,即运用函数char *setlocale(int category, const char *locale);,将当前字符集设为可以使用汉字的字符集。      注意,由于Linux下不同的内核版本支持的中文字符集标示不一样,此时可以在终端中输入命令locale -a来查询你的Linux可以支持的字符集名称。      同样,函数wcstombs的用法也是一样。本文出自 51CTO.COM技术博客

赞(0) 打赏
转载请注明出处:服务器评测 » Linux下Unicode的使用实践笔记
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏