前言
1. ICU 官方网站http://icu-project.org/
2. ICU 版本下载地址http://site.icu-project.org/download,进入后下载ICU4C版本。
3. ICU于5月25号发布Release版本4.8,后期更新版本建议只更新Release版本。
4. ICU 用户指南http://userguide.icu-project.org/
5. 对于我们的中间件来讲,目前使用到的ICU功能仅为字符编码转换,所以我们的工程中只需包含ICU工程的common工程和stubdata工程。编译出可执行文件为icuuc48.dll和icudt48.dll(linux中为libicuuc48.dll.a和libicudata48.dll.a)
6. 对于ICU来讲有两种方式连接数据文件(多语言文件),一种是直接把资源文件编译到icudt48.dll或libicudata48.dll.a文件中,这样的文件编译出来会比较大,目前4.8版本中的资源文件为17M,另一种方法是挑选需要的资源文件编译成.dat文件(如icudt48l.dat),.dat文件可以跨平台使用,然后通过icudt48.dll或libicudata48.dll.a连接到.dat文件的方式来使用资源文件。
7. ICU网站可以生成用户自定义的.dat文件,这样我们只需要生成我们需要的字符编码资源就可以大大削减.dat文件的大小。自定义资源文件网站为
http://apps,icu-project.org/datacustom/
8. 如在ICU代码中添加注释,则应使用‘/*do something*/’的形式,因为‘//’格式注释在编程其他工程时可能产生异常情况。
9. 更多内容请看工程下的readme.html。
另:上述所有资源暂时只能通过使用网络代理的方式获得(简单的讲就是需翻墙)
编译和配置ICU方案:
在VS下编译
1. ICU所有工程项目均在一个工程中包含,即<解压目录>/ source/allinone中的allinone.sln
2. 由于网达平台软件基本上均为UTF-8的编码方式,建议直接修改编码宏,这样可以提高ICU的执行效率。
· #ifndef U_CHARSET_IS_UTF8
· -# define U_CHARSET_IS_UTF8 0
· +# define U_CHARSET_IS_UTF8 1
· #endif
3. 为支持网达平台,在代码中增加U_WDFORM的宏定义,具体可参见当前版本中的修改方式。
编译ICU在网达平台(需使用VS2010)
1.在工程中添加-》新建解决方案文件夹,命名为ICU,如下图
2.在ICU文件夹下 右击--》添加—》现有项目
添加icu目录下Common工程和icu目录下stubdata工程,如下图所示
4. 编译stubdata工程和common工程,编译完成后,会在Cinderella\include目录下生成一个unicode目录,里边是ICU所需的库文件,在Cinderella\lib目录下生成icudt.lib和icuuc.lib(如果生成icuucd.lib则是因为编译的是debug版本,切换release编译即可),在Cinderella\bin目录下生成icudt48.dll和icuuc48.dll。
另:如果升级版本后出现编译stubdata时出现找不到\data\misc\icudata.rc的error,请自行删除resourcefiles 文件中的icudata.rc文件,如图
5. 我们工程中会使用到icuuc.lib,会在Cinderella\lib目录下
6. 成功编译后,使用ICU的方法于下章介绍。
在cygwin下编译ICU
1.首先进入Cinderella\icu目录(此目录应为ICU原始下载代码中source目录的所有代码)
2.在此目录下依次运行命令行参数
chmod +x runConfigureICUconfigure install-sh //用于申请权限
./runConfigureICU Linux--with-data-packaging=archive //用于生成配置文件、makefile文件和.dat文件。
(注,在此为Linux系统下的配置文件,如果要在其他系统下使用,则可以查看./runConfigureICU–h 命令,如下图,并使用下图中的系统参数代码替换此命令中的Linux,如,需要生成mac系统上的工程,则命令行应为./runConfigureICU MacOSX--with-data-packaging=archive)
3.此时可使用common和stubdata目录下的makefile文件生成对应系统的.a文件,具体过程为分别使用cygwin定位到到common目录和stubdata目录下,执行make操作。如图
完成后
另:如果出现找不到lib目录的error,则需手动在common的上级目录上新建一个lib的文件夹
4.make完成后会生成.a文件,复制到我们的目录后在头引用中添加这两个.a文件即可
在mingw下编译
现只支持icu4.6版本在mingw下编译,具体编译过程为
1. 安装mingw+msys(过程参见《Dillo 编译使用文档》)
2. 下载icu4.6和icu4.6mingw32.diff文件
http://download.icu-project.org/files/icu4c/4.6/icu4c-4_6-src.zip
http://devs.openttd.org/~terkhen/libicu/libicu_4_6_mingw32.diff
3. 下载的文件复制到C:\msys\1.0\home\Administrator文件夹中
4. 打开msys,执行命令操作
unzip icu4c-4_6-src.zip(如果没有unzip,可自行解压)
5. 进入icu目录,操作符
Cd icu
6. 复制libicu_4_6_mingw32.diff到icu目录下
7. 执行替换操作,操作符
patch -p1 -ilibicu_4_6_mingw32.diff
8. 执行编译和安装操作
cd source
./configure--enable-static --disable-shared --disable-strict --disable-threads
make install
ICU使用方法:
目前只使用到icu的字符编码转换功能,使用方法为
1.平台在调用icu函数前应先设置.dat文件的路径,一般在程序初始化时完成。
Sample:
//Just a demo
#include "unicode/putil.h"
main()
{
//dosomething
char*dir = "/somedir/somedir/somedir" //此路径下应存在.dat文件,在4.8版本中库文件为icudt48l.dat
u_setDataDirectory(dir); //icu库函数
//dosomething
return;
}
2.使用字符编码转换函数
Sample1:
//Just a demo
//最简单的使用方法,直接转换源字符编码到目标字符编码
#include "unicode/ucnv.h"
Somefuction1()
{
//dosomething
char*src = "abc中文"; //文件编码,我们平台为utf-8编码
chardest[100] = {0x00}; //存储转换编码后的字符
UErrorCodestatus = U_ZERO_ERROR; //ICU的错误码
intlen = ucnv_convert("gb2312", "utf-8", dest, 100, src,strlen(src), &status);
//此函数从utf-8形式编码的src字符串转换为gb2312编码的dest字符串
//返回为dest字符传的实际长度
if (U_FAILURE(status)) {
printf("FAIL: ucnv_convert() failed, error=%s\n",
u_errorName(status));
}//判断是否转换成功
//dosomething
return;
}
Sample2:
//Just a demo
#include "unicode/ucnv.h"
//此转换形式首先把源编码转换为unicode编码,再从unicode编码转换为目标编码
//一些语言文字(如:藏文)只能使用unicode编码,此函数和直接转换为unicode编码使用
somefuction2()
{
//dosomething
char*src = "abc中文"; //文件编码,我们平台为utf-8编码
chardest[100] = {0x00}; //存储转换编码后的字符
wchar_tub[100] = {0x0000}; //存储Unicode字符编码
UErrorCodestatus = U_ZERO_ERROR; //ICU的错误码
UConverter*conv;
//设置转换器,如果不成功则conv== NULL status返回错误码
conv= ucnv_open("utf-8", &status);
if(U_FAILURE(status) || cnv == NULL) {
return NULL;
}
//从conv设置的字符编码转换为unicode字符编码
intlen = ucnv_toUChars(conv, ub, 100, src,strlen(src), &status);
if (U_FAILURE(status)) {
printf("FAIL: ucnv_convert() failed, error=%s\n",
u_errorName(status));
}//判断是否转换成功
//释放资源
ucnv_close(conv);
//至此完成源编码到unicode编码转换
//设置转换器,如果不成功则conv== NULL status返回错误码
conv= ucnv_open("gb2312", &status);
if(U_FAILURE(status) || cnv == NULL) {
return NULL;
}
//从unicode字符编码转换为conv设置的字符编码
len= ucnv_fromUChars(conv, dest, 100, ub, len,&status);
if (U_FAILURE(status)) {
printf("FAIL: ucnv_convert() failed, error=%s\n",
u_errorName(status));
}//判断是否转换成功
//释放资源
ucnv_close(conv);
//dosomething
return;
}
注意事项:
1.如果使用原始.dat文件,则icu支持229种字符编码转换(17M文件),其中大多数我们项目未牵扯到。可以使用前言中的方法自定义.dat文件中编码转换的数量。如果想查看目前支持的转换编码种类,则使用
int32_t count;
int32_t i;
//**************************** START SAMPLE *******************
count = ucnv_countAvailable();
printf("Availableconverters: %d\n", count);
for(i=0;i<count;i++)
{
printf("%s", ucnv_getAvailableName(i));
}
查看.dat文件中支持的字符编码名称。此名称里可能不包含你所使用的目标字符集,如ansi,ICU使用字符集可能包含目标字符集,所以只要找到一个能成功转换的字符集名称即可(可以使用循环的方式从源字符集循环到所有支持的目标字符集,查找需要转换的字符集名称)
2.更多关于字符转换的代码可在icu目录下的/amples/ucnv工程中展现。
更多内容见我的下载