FreeBSD下宽字节与多字节互相转换的函数支持
2009-05-13 07:39:28来源:未知 阅读 ()
FreeBSD中对多字节语言编码进行支持的基本原理是:
1、提供了统一的处理机制,就是宽字节处理,这样就避免出现“半个字”的问题,所有的字符都是作为一个单独的对象(宽字节字符)来处理。在freebsd系统中,宽字节字符定义为4个字节,可以容纳Unicode的所有字符。在libc中,Freebsd提供了以下函数,来支持wcmb
mb -> wc
字符处理:
mbtowc
mbrtowc
字符串处理:
mbstowcs
mbsrtowcs
mbsnrtowcs
wc -> mb
字符处理:wctomb wcrtomb
字符串处理:wcstombs wcsrtombs wcsnrtombs
通过这些函数,可以实现系统底层对多字节语言编码的处理,大致的流程是:
多字节字符首先要转换成宽字节字符,然后由系统提供的宽字节字符、字符串处理函数进行处理,诸如排序、比较、输出。根据需要再把处理的结果通过wc -> mb的函数进行转换,转换成特定的多字符编码格式。
2、对特定多字符编码格式的绑定:
对于汉字处理来说,存在多种编码格式,诸如UTF-8、GB2312、GBK、GB18030等等,由于编码方式的不同,在进行wcmb转换的时候,就需要不同的转换规则对其进行支持。这种绑定从原理上说是通过locale的LC_CTYPE来实现的。
具体的实现,是在/usr/src/lib/libc/locale目录下,原理是当应用程序调用setlocale函数来设定locale时,系统会对LC_CTYPE进行检查,并根据LC_CTYPE的值,对wcmb处理函数进行切换。例如:
阅读mbrtowc函数(mbrtowc.c)
size_t
mbrtowc(wchar_t * __restrict pwc, const char * __restrict s,
size_t n, mbstate_t * __restrict ps)
{
static mbstate_t mbs;
if (ps == NULL)
ps = &mbs;
return (__mbrtowc(pwc, s, n, ps));
}
它最终调用的是__mbrtowc(),__mbrtowc是一个函数指针,在setrunelocale.c中,这个指针会根据系统当前的LC_CTYPE进行初始化,如果当前的LC_CTYPE=zh_CN.GB18030,系统会转向执行GB18030.c中的_GB18030_init()函数,在这个函数里面,这个函数指针会指向GB18030.c中的_GB18030_mbrtowc()函数:
int
_GB18030_init(_RuneLocale *rl)
{
__mbrtowc = _GB18030_mbrtowc;
__wcrtomb = _GB18030_wcrtomb;
__mbsinit = _GB18030_mbsinit;
_CurrentRuneLocale = rl;
__mb_cur_max = 4;
return (0);
}
而_GB18030_mbrtowc()函数具体实现了GB18030编码的字符到宽字节字符的转换:
static size_t
_GB18030_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s,
size_t n, mbstate_t * __restrict ps)
{
_GB18030State *gs;
wchar_t wch;
int ch, len, ocount;
size_t ncopy;
gs = (_GB18030State *)ps;
if (gs->count 0 || gs->count > sizeof(gs->bytes)) {
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- FreeBSD 7.2 发布 2009-05-13
- 最便宜的空间域名! 2014-11-11
- FreeBSD 7.2-RELEASE 正式命名 2009-05-13
- FreeBSD 7.2-RELEASE 发行说明(草稿)(ZZ) 2009-05-13
- 去掉X11 GUI支持提高VIM运行速度 2009-05-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash