快速业务通道

Linux下Unicode的使用

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-28
最近,开始了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 会如此流行的原因.像 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);
其次,介绍我个人的总结.
     我的移植内容是在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的用法也是一样.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号