UTF--->Unicode--->Ansi 这个最终返回的中文字符才是正确的,否则中文是乱码
来源:互联网 发布:佳都数据服务有限公司 编辑:程序博客网 时间:2024/05/16 18:28
具体区别:
ANSI:16384个字符。这就是ANSI字符标准。英文一个字节,中文两个字节,是多字节字符串
UNICODE: 使用两个字节对世界上几乎所有的语言进行编码(0x0000-0xFFFF),65536个字符,每种语言的代码段不同,两个字节(英文、中文都是两个字节)所表达的字符是唯一的,所以不同语种可以共存于文本中,解决国际化的问题,是宽字符串
UTF8是Unicode一种压缩形式,英文A在unicode中表示为0x0041,老外觉得这种存储方式太浪费,因为浪费了50%的空间,于是就把英文压缩成1个字节,成了utf8编码,但是汉字在utf8中占3个字节,显然用做中文不如ansi合算,这就是中国的网页用作ansi编码而老外的网页常用utf8的原因。
1.每个英文字母、数字所占的空间为1 Byte;
2.泛欧语系、斯拉夫语字母占2 Bytes;
3.汉字占3 Bytes。
由此可见UTF8对英文来说是个非常诱人的方案,但对中文来说则不太合算,无论用ANSI还是 Unicode/UCS2来编码都只用2 Bytes,但用UTF8则需要3 Bytes。
1.拉丁语系平均用1.1 Bytes;
2.希腊文、俄文、阿拉伯文和希伯莱文平均用1.7 Bytes;
3.其他大部份文字如中文、日文、韩文、Hindi(北印度语)用约3 Bytes;
4.用超过4 Bytes的都是些非常少用的文字符号。
由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。因此,提出了Unicode字符集,它固定使用16 bits(两个字节、一个字)来表示一个字符,共可以表示65536个字符。将世界上几乎所有语言的常用字符收录其中,方便了信息交流。标准的Unicode称为UTF-16。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。注意UTF-8是编码,它属于Unicode字符集。
Unicode字符集有多种编码形式,而ASCII只有一种,大多数MBCS(包括GB-2312)也只有一种。
13. 如何在Unicode与ANSI之间转换字符串?
Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;
函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。
char * recongize(IplImage * recimg ,int n,char * temp){tesseract::TessBaseAPI api;wchar_t *tempchar;char * resulttemp;char* text;char* font1;if (n==0){font1 = "eng";//数字或字母}else{font1 = "chi_sim";//中文}api.Init(NULL, font1, tesseract::OEM_DEFAULT);api.SetImage((unsigned char*)(recimg->imageData), recimg->width, recimg->height, recimg->nChannels, recimg->widthStep);api.SetRectangle(0, 0, recimg->width, recimg->height);text = api.GetUTF8Text();tempchar = Utf_8ToUnicode(text);resulttemp = UnicodeToAnsi(tempchar);strcpy(temp,resulttemp);delete []tempchar; //一定要释放这个,因为在Utf_8ToUnicode(text)这个函数时里分配了内存空间delete []resulttemp;//szWriteLog("内容 resulttemp---:%s",resulttemp);return temp;}
//utf-8转unicodewchar_t * CIDcardRecogizeDlg::Utf_8ToUnicode(char* szU8) {//UTF8 to Unicode//由于中文直接复制过来会成乱码,编译器有时会报错,故采用16进制形式//预转换,得到所需空间的大小int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间wchar_t* wszString = new wchar_t[wcsLen + 1];//转换::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);//最后加上'\0'wszString[wcsLen] = '\0';return wszString;}
//将宽字节wchar_t*转化为单字节char* char* CIDcardRecogizeDlg::UnicodeToAnsi( const wchar_t* szStr ) { int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL ); if (nLen == 0) { return NULL; } char* pResult = new char[nLen]; WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL ); return pResult; }
wchar_t是C/C++的字符类型,是一种扩展的存储方式,wchar_t类型主要用在国际化程序的实现中,但它不等同于uni编码。uni编码的字符一般以wchar_t类型存储。
- UTF--->Unicode--->Ansi 这个最终返回的中文字符才是正确的,否则中文是乱码
- 中文字符编码:GB2312、GBK、ANSI、Unicode、UTF-8
- 中文字符返回的时出现乱码
- Python对中文字符的处理(utf-8/ gbk/ unicode)
- 又遇乱码,GBK网页AJAX,PHP接收的中文字符是UTF-8编码的
- 如何解决cut off中文字符(unicode)产生的乱码
- 烦人的字符编码:ANSI、UNICODE、UTF (转)
- 字符编码的故事(ASCII,ANSI,Unicode,Utf-8)
- 字符编码的故事(ASCII,ANSI,Unicode,Utf-8)
- 字符编码的故事(ASCII,ANSI,Unicode,Utf-8)
- 【转】字符编码-ANSI、UNICODE、UTF的来源与区别
- 字符编解码的故事(ASCII,ANSI,Unicode,Utf-8)
- c++字符编码的总结(ANSI、Unicode、UTF、UCS)
- xshell 3.0中文乱码最终的解决方案
- 字符编码:ANSI, UNICODE, UTF
- 字符编码:ANSI、UNICODE、UTF
- RIDE中的字符转换、中文、python的gbk解码 unicode('${org_name}',"utf-8")
- java读取默认编码是ansi的文本文件时,解决中文乱码问题
- Amazon AWS 中国区 G2 服务器 配置运行
- 数据技术----大众点评
- lambda表达式
- ubuntu gedit中文乱码解决
- Android getWindow().setFlags方法
- UTF--->Unicode--->Ansi 这个最终返回的中文字符才是正确的,否则中文是乱码
- 图像分析:投影曲线的波峰查找
- OpenCV手势识别-手掌特征提取
- 开始刷leetcode day10:Merge Two Sorted Lists
- IOS开发我该如何学习?
- 【第四章】 资源 之 4.2 内置Resource实现 ——跟我学spring3
- OpenCV 无法启动此程序,因为计算机中丢失opencv_core249d.dll或者opencv_highgui249d.dll。请尝试重新安装改程序已解决此问题
- 创新吃鱼法
- Struts2 知识点总结