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()
cat 和 echo 那样的程序就不需要修改.字节流仍只是字节流,并没有对它进行任何处理.ASCII 字符和控制代码在 UTF-8 语言环境中不改变.
通过字节计数对字符进行计数的程序需要一些小小的改动.在 UTF-8 中应用程序不对任何扩展的字节进行计数.如果选择了 UTF-8 语言环境,C 语言库的 strlen(s) 函数需要用 mbstowcs() 函数来代替:
清单 2. mbstowcs() 函数
strlen 的一种常见用法是估算显示宽度.中文和其它表意符号将占用两列位置. wcwidth() 函数用来测试每个字符的显示宽度: 清单 3. wcwidth() 函数
我的移植内容是在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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于Linux下Unicode的使用的所有评论