SDL入门教程(十):3、字符集之间的转换,win32下的libiconv
来源:互联网 发布:ubuntu打开anaconda2 编辑:程序博客网 时间:2024/06/13 02:06
作者:龙飞
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的演示程序
我们还是边写程序边做说明:
3.3:iconv的问题。
我们似乎已经解决问题了。但是有一个问题是,这样转换的编码是8位的,即unsigned char,而SDL需要的是16位的,即Uint16;第二个问题是,我说了,这是纯中文,你试试在“你”和“好”之间加段英语是什么效果?结论是,转换不能正常进行,在遇到第一个非汉字的时候,就终止了。
问题还是没解决,研究还得继续。
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进制的。我们在前面用过。#include <string>
#include <iomanip>
#include "GNU/iconv.h"
void showHex(int x);
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的参数。{
//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;
//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。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);
//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()。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;
}
3.3:iconv的问题。
我们似乎已经解决问题了。但是有一个问题是,这样转换的编码是8位的,即unsigned char,而SDL需要的是16位的,即Uint16;第二个问题是,我说了,这是纯中文,你试试在“你”和“好”之间加段英语是什么效果?结论是,转换不能正常进行,在遇到第一个非汉字的时候,就终止了。
问题还是没解决,研究还得继续。
此文章来自于【http://blog.csdn.net/lf426/article/details/2243029】
- SDL入门教程(十):3、字符集之间的转换,win32下的libiconv
- SDL入门教程(十):3、字符集之间的转换,win32下的libiconv
- SDL入门教程(十):1、多语言支持,Win32下的GetText
- SDL入门教程(十):1、多语言支持,Win32下的GetText
- SDL入门教程(十):4、用iconv获得正确的Unicode,使用FriBiDi实现UTF-8到Unicode的正确转换
- SDL入门教程(十):4、用iconv获得正确的Unicode,使用FriBiDi实现UTF-8到Unicode的正确转换
- SDL入门教程(一):3、MinGW 下的安装与设置
- SDL入门教程(一):3、MinGW 下的安装与设置
- SDL入门教程(一):3、MinGW 下的安装与设置
- SDL入门教程(六):SDL读取其它格式的图片
- SDL入门教程(六):SDL读取其它格式的图片
- SDL入门教程(四):3、SDL的软、硬件渲染的深入试验和分析
- SDL入门教程(四):3、SDL的软、硬件渲染的深入试验和分析
- 在Visual Studio平台上的应用libiconv库进行字符集转换的范例
- SDL入门教程(五):3、对SDL_BlitSurface()的进一步讨论
- SDL入门教程(五):3、对SDL_BlitSurface()的进一步讨论
- libiconv字符集转换库使用方法
- libiconv字符集转换库使用方法
- xcode4 svn配置
- 雨中飘荡的回忆
- SDL入门教程(十):2、直接通过Unicode让SDL显示中文
- windows下弹出指定USB设备的小程序
- Java解析XML
- SDL入门教程(十):3、字符集之间的转换,win32下的libiconv
- Linux上vi(vim)编辑器使用教程
- c# 读取excel文件的三种方法
- SDL入门教程(十):4、用iconv获得正确的Unicode,使用FriBiDi实现UTF-8到Unicode的正确转换
- SDL入门教程(十):5、SDL完美显示中文
- 获取语言ID
- 位操作求出integer的绝对值
- ACM中数论方面题目集
- SDL入门教程(十一):1、SurfaceClass类的再设计