作者:龙飞
3.1:GNU的libiconv项目
http://www.gnu.org/software/libiconv/
再一次的,感谢伟大的GNU。我们需要的是Unicode码,在程序中转换,我们需要相应的库。libiconv支持许多字符集,包括我们将用到的GB2312,UTF-8和UCS-2(Unicode)。具体的,在项目主页上有详细的说明。我们需要新学习直接用的类容并不繁多,同样的,如果你没什么兴趣自己编译源代码,可以直接用在win32下编译好的头文件,库和动态链接库(DLL)。win32下的项目主页是:
http://gettext.sourceforge.net/
有趣的是,作者把它作为了我们前面提到的gettext的一部分。在下载页面上,我们直接选择 libiconv-win32,同样的,我直接给出所需要的三部分文件的相关信息:
iconv.h:头文件,请在C++代码中#include进来;
iconv.lib:库文件,在编译时候使用;
iconv.dll:动态链接库,请放到exe文件能找到的路径下(通常与exe在同一文件夹下面)
下面,我们看看libiconv的使用方法。
3.2:libiconv的演示程序
我们还是边写程序边做说明:
#include
<
iostream
>
#include
<
string
>
#include
<
iomanip
>
#include
"
GNU/iconv.h
"
void
showHex(
int
x);
<iomanip>和showHex函数,是用来现实16进制的。我们在前面用过。
int
main(
int
argc,
char
*
argv[])
{
//
src string
const
std::
string
str
=
"
你好
"
;
//
string size
const
int
STR_SIZE
=
256
;
//
string to be changed
const
unsigned
char
*
src
=
(
const
unsigned
char
*
)(str.c_str());
size_t src_len
=
strlen((
char
*
)src);
//
string after changed
unsigned
char
dst[STR_SIZE]
=
{
0
};
size_t dst_len
=
sizeof
(dst);
//
iconv's arg
const
unsigned
char
*
in
=
src;
unsigned
char
*
out
=
dst;
std::cout
<<
"
src:
"
<<
src
<<
std::endl;
我们用来转换的字符串是“纯中文”(为什么我要加引号重点说明,后面会有原因的解释)"你好"。STR_SIZE是预留的转换内存空间。为什么不用动态存储呢?因为我试过,有错误,可能是iconv自身的限制。src是C风格的源字符串,dst是转换后的unsigned char数组。in和out是用于inconv的参数。
//
GB2312 to UCS-2 (Unicode)
iconv_t cd;
cd
=
iconv_open(
"
UCS-2
"
,
"
GB2312
"
);
if
((iconv_t)
-
1
==
cd){
return
-
1
;
}
iconv(cd, (
const
char
**
)
&
in
,
&
src_len, (
char
**
)
&
out
,
&
dst_len);
iconv_close(cd);
这一段是编码的转换,详细内容请查阅iconv的doc。
//
Unicode dst
std::cout
<<
"
dst:
"
;
int
unicode_len
=
strlen((
char
*
)dst);
for
(
int
i
=
0
; i
<
unicode_len; i
++
) {
showHex(dst[i]);
}
std::cout
<<
std::endl;
return
0
;
}
void
showHex(
int
x)
{
using
namespace
std;
cout
<<
hex;
cout
<<
"
0x
"
<<
setw(
4
)
<<
setfill(
'
0
'
)
<<
x
<<
"
"
;
cout
<<
dec;
}
最后一部分是显示转换后代码。包括函数showHex()。
3.3:iconv的问题。
我们似乎已经解决问题了。但是有一个问题是,这样转换的编码是8位的,即unsigned char,而SDL需要的是16位的,即Uint16;第二个问题是,我说了,这是纯中文,你试试在“你”和“好”之间加段英语是什么效果?结论是,转换不能正常进行,在遇到第一个非汉字的时候,就终止了。
问题还是没解决,研究还得继续。