1.ICUUC简介
ICU4C是ICU在C/C++平台下的版本, ICU(International Component for Unicode)是基于”IBM公共许可证”的,与开源组织合作研究的, 用于支持软件国际化的开源项目。ICU4C提供了C/C++平台强大的国际化开发能力,软件开发者几乎可以使用ICU4C解决任何国际化的问题,根据各地的风俗和语言习惯,实现对数字、货币、时间、日期、和消息的格式化、解析,对字符串进行大小写转换、整理、搜索和排序等功能,必须一提的是,ICU4C提供了强大的BIDI算法,对阿拉伯语等BIDI语言提供了完善的支持。

2.安装
2.1 在http://www.icu-project.org/download/4.2.html下载ICU4C库,我下载的是icu4c-49_1_2-src.tgz。
2.2 执行如下命令,安装成功:

tar -zxvf icu4c-49_1_2-src.tgz
cd icu/source
./configure
make
make install
1
2
3
4
5
3.代码
3.1 myicu.h

#ifndef MYICU_H
#define MYICU_H
#include “unicode/utypes.h”
#include “unicode/ucsdet.h”
#include “unicode/ucnv.h”
#include
#include
#include
#include
#include
using namespace std;

#define BUF_MAX 4096
class MyIcu{
public:
MyIcu(const char* filename);
bool detectTextEncoding();
bool convertoUtf8();
int convert(const char *toConverterName, const char fromConverterName,
char target, int32_t targetCapacity, const char source, int32_t sourceLength);
~MyIcu();
private:
const char
m_filename;
FILE
file;
char
detected;
};
#endif //MYICU_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
3.2 myicu.cpp

#include “myicu.h”
const int BUFFSIZE=8192;
MyIcu::MyIcu(const char* filename):m_filename(filename){
}

MyIcu::~MyIcu(){
fclose(file);
delete [] detected;
}
bool MyIcu::detectTextEncoding(){
UCharsetDetector* csd;
const UCharsetMatch **csm;
UErrorCode status = U_ZERO_ERROR;
char buffer[BUFFSIZE];
int inputLength,match, matchCount = 0;
file = fopen(m_filename, “rb”);
if (file == NULL) {
cout<<“open file error”<<endl;
return 0;
}
inputLength = (int32_t) fread(buffer, 1, BUFFSIZE, file);

csd = ucsdet_open(&status);
ucsdet_setText(csd, buffer,inputLength, &status);
csm = ucsdet_detectAll(csd, &matchCount, &status);
if(csm == NULL){ucsdet_close(csd);return 0;
}
detected = new char[128];

#if 0
for(match = 0; match < matchCount; match += 1) {
const char *name = ucsdet_getName(csm[match], &status);
const char *lang = ucsdet_getLanguage(csm[match], &status);
int32_t confidence = ucsdet_getConfidence(csm[match], &status);

    if (lang == NULL || strlen(lang) == 0) {lang = "**";}cout<<name <<"("<<lang<<")"<<confidence<<endl;
}

#endif
if(matchCount > 0)
{
detected = strdup(ucsdet_getName(csm[0], &status)); //分配了内存, 需要释放
if(status != U_ZERO_ERROR)
return false;
}
cout<<"charset = "<<detected<<endl;
ucsdet_close(csd);
return 1;
}

bool MyIcu::convertoUtf8(){
file = fopen(m_filename, “rb”);
if(file == NULL)
{
cout<<“open file error”<<endl;
return 0;
}

int len = 0;
//char *detected;  char *buffer = new char[BUF_MAX];
char *target = new char[BUF_MAX * 2];  while(true)
{  memset(buffer, 0, BUF_MAX);  memset(target, 0, BUF_MAX * 2);  len = (int32_t)fread(buffer, sizeof(char), BUF_MAX, file);  if(detected == NULL)  {  if(!detectTextEncoding()) //编码探测  break;  }  //转换为utf8字符编码  if(convert("UTF-8", detected, target, BUF_MAX * 2, (const char*)buffer, len) != U_ZERO_ERROR)  {  cout<<"ucnv_convert error"<<endl;break;  }  cout<<target<<endl;//打印出转换的文件的字符串  if(len < BUF_MAX)  break;
}  delete [] buffer;
delete [] target;  return 1;

}

int MyIcu::convert(const char *toConverterName, const char *fromConverterName,
char *target, int32_t targetCapacity, const char *source, int32_t sourceLength){

             UErrorCode error = U_ZERO_ERROR;  ucnv_convert(toConverterName, fromConverterName, target, targetCapacity,source, sourceLength, &error);  return error;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
3.3 main.cpp

#include “myicu.h”
#include

#include
#define BUF_MAX 4096

int main(){
const char* filename = “123.txt”;
MyIcu myicu(filename);
//char* buff = new char[126];
bool flag = myicu.detectTextEncoding();
if(!flag){
std::cout<<“解析错误!”<<endl;
}
bool flag2 = myicu.convertoUtf8();
if(!flag2){
std::cout<<“转换错误!”<<endl;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
4编译
g++ -o target main.cpp myicu.cpp -licuuc -licui18n
1
如果找不到icuuc和icui18n动态库的话,执行如下命令:

vim /etc/ld.so.conf
1
将/usr/local/目录加进去,然后再

ldconfig
1
就行了。

你们可以试下自己准备的文件。

参考文档:
http://icu-project.org/apiref/icu4c/index.html

————————————————
版权声明:本文为CSDN博主「扮猪吃饺子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_28712713/article/details/77894404

CU4C字符集检测和转换,C++版本相关推荐

  1. php支持 的编码,php编码转换函数(自动转换字符集支持数组转换)

    当接受未知客户端提交的数据时,由于各客户端的编码不统一,但服务器端最终只能以一种编码方式来处理,这种情况下就会涉及到编码转换的问题. 复制代码 代码如下: // 自动转换字符集 支持数组转换 func ...

  2. JS window对象 Navigator对象 Navigator 对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本。...

    Navigator对象 Navigator 对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本. 对象属性: 查看浏览器的名称和版本,代码如下: <script type=" ...

  3. linux perl模块检测,Linux有问必答:如何用Perl检测Linux的发行版本

    提问:我需要写一个Perl程序,它会包含Linux发行版相关的代码.为此,Perl程序需要能够自动检测运行中的Linux的发行版(如Ubuntu.CentOS.Debian.Fedora等等),以及它 ...

  4. java pdf版本转换_Java 转换 PDF 版本

    在日常工作或生活中,我们使用的某些设备可能对PDF版本有严格要求,此时就需要更改PDF版本来适应设备.本文就将展示如何通过Free Spire.PDF for Java来转换PDF版本.(支持转换PD ...

  5. 如果检测到有老版本存在就先卸载老版本才形始新的安装过程

    如果检测到有老版本存在就先卸载老版本才形始新的安装过程,写了如下代码 QUOTE Function .onInit      ReadRegStr $0 HKLM "${PRODUCT_UN ...

  6. 在C++中检测和转换字节序(ENDIAN)

    转自:http://www.cppblog.com/johndragon/archive/2007/04/18/22201.html 在做跨平台的网络数据传输和文件数据转换和移植的时候,经常会碰到CP ...

  7. CAD文件低版本怎么转换高版本

    我们在工作当中需要CAD格式的素材,但是在网上下载的CAD文件版本过低不兼容,使得这些素材我们不好使用,这时候我们需要将它转换成高一点的版本,那么CAD文件低版本怎么转换高版本呢? 这里小编就用在线转 ...

  8. cad批量转换低版本如何实现?

    在CAD制图工作中,我们可能会遇到一些比较麻烦的问题.其中就有CAD图纸由于版本过高导致无法打开查看的问题,而且有时候CAD图纸过多,若是每 一张单独查看也会很麻烦.这时候该如何解决呢?cad批量转换 ...

  9. CCNA 640-802,CCENT和CCNP练习题库LMI的自动检测,转换,以及更多!

    CCNA 640-802,CCENT和CCNP练习题库LMI的自动检测,转换,以及更多! 这里有一些免费的CCNA 640-802,CCENT和思科CCNP认证考试问题要问你! CCNA 640-80 ...

最新文章

  1. Spring Cloud应用开发(四:服务容错保护)
  2. 【CCNP考试】2010-01-31-北京-845(PASS)
  3. ________________2058_______________后台数据不够。可能误判。
  4. python游戏设计案例实战pdf_实战案例 | 新蔡规划馆设计方案
  5. java正三角形程序怎么写,java实现正三角形和到正三角形
  6. 三维重建1-位姿追踪:单应矩阵、本质矩阵和基本矩阵
  7. 《终身成长》读书笔记(part4)--创造性并不是出自灵感的神奇行为,而是努力工作和倾情奉献的结果
  8. 结构体中.和-的用法
  9. 日语学习-多邻国-平假名
  10. Excel-基本操作
  11. THREEJS - 点击/拾取
  12. 2022-2028年中国商用车产业园区行业市场竞争态势及未来前景分析报告
  13. Matlab故障树的最小割集的求解
  14. android logo颜色渐变,华为悄然更新品牌Logo:无渐变色,更加扁平化
  15. 小游戏系列——猜数字游戏
  16. Android Studio 4.2Previw版本编译错误提示Disable offline mode and rerun the build
  17. IE和win10自带edge浏览器无法上网,其他浏览器可以(3个步骤图解)
  18. 利用PHP GD库生成位图
  19. 【现代通信原理笔记】8 蜂窝系统
  20. java网课|File类递归

热门文章

  1. 假设检验:p-value,FDR,q-value
  2. 【算法】10亿int型数,统计只出现一次的数
  3. 青藤放飞“猎鹰”,主动防御又多一张牌
  4. Java 中 throw 和 throws 联系与区别
  5. 云计算的概念、原理和关键技术
  6. ngnix配置及实例
  7. 博文视点Web 2.0 大局观
  8. 抖快推出流媒体音乐平台 会改变在线音乐市场格局吗?
  9. 电脑横机服务器维修,国产电脑横机操作和维修方法
  10. 一周一书一文(20160814):让未来现在就来——彭小六