常用的简体中文编码GB2312/GBK以及后续兼容标准所属的代码页为CP936,使用如下命令可以把CP936转换为UTF-8的编码格式:
iconv -f CP936 -t UTF-8 < input.txt > output.txt具体的,命令行用法详见"man iconv",函数库用法见"man 3 iconv"。
在iconv不可用的情况下,UTF-8转UNICODE可以很直接的实现,以下代码摘自SDL_ttf:
/*
SDL_ttf: A companion library to SDL for working with TrueType (tm) fonts
Copyright (C) 1997-2004 Sam Lantinga
*/
static Uint16 *LATIN1_to_UNICODE(Uint16 *unicode, const char *text, int len)
{
int i;
for ( i=0; i < len; ++i ) {
unicode[i] = ((const unsigned char *)text)[i];
}
unicode[i] = 0;
return unicode;
}
static Uint16 *UTF8_to_UNICODE(Uint16 *unicode, const char *utf8, int len)
{
int i, j;
Uint16 ch;
for ( i=0, j=0; i < len; ++i, ++j ) {
ch = ((const unsigned char *)utf8)[i];
if ( ch >= 0xF0 ) {
ch = (Uint16)(utf8[i]&0x07) << 18;
ch |= (Uint16)(utf8[++i]&0x3F) << 12;
ch |= (Uint16)(utf8[++i]&0x3F) << 6;
ch |= (Uint16)(utf8[++i]&0x3F);
} else
if ( ch >= 0xE0 ) {
ch = (Uint16)(utf8[i]&0x0F) << 12;
ch |= (Uint16)(utf8[++i]&0x3F) << 6;
ch |= (Uint16)(utf8[++i]&0x3F);
} else
if ( ch >= 0xC0 ) {
ch = (Uint16)(utf8[i]&0x1F) << 6;
ch |= (Uint16)(utf8[++i]&0x3F);
}
unicode[j] = ch;
}
unicode[j] = 0;
return unicode;
}
其他语言中的实现,例如OCaml中的,可以参考如第三方下库:
http://ocaml-extlib.googlecode.com/svn/doc/apiref/UTF8.html
上面已经说过用UTF-8来储存并读取为Unicode来处理,我们现在所需要的只是这两个编码间的互相转换就可以了,并注意Unicode编码还有一个字节序的问题。
没有评论:
发表评论