FreeBSD下宽字节与多字节互相转换的函数支持

2009-05-13 07:39:28来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

在FreeBSD下,对多字节语言编码的处理是通过“多字节字符(mb)与宽字节字符(wc)的互相转换”来提供支持的。作为系统内部,Freebsd在libc函数级别上对“宽字节wc“提供了很好的支持,所有宽字节处理函数均定义在“/usr/src/include/wchar.h“中。
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中shell环境的设定

下一篇:摘抄整理:Freebsd“中文化”的支持