跨平台Unicode与UTF8互转代码
参考来源:http://blog.csdn.net/flying8127/article/details/1598521
在原来原基础上,将代码整理,并加强安全性. 并按照WindowsAPI设计, 添加输出缓冲长度探测功能
当OutUTFString为NULL时, 可以进行输出的UTF8字符串长度探测
1: uint32 UniCharToUTF8(wchar_t UniChar, char *OutUTFString)
2: {
3:
4: uint32 UTF8CharLength = 0;
5:
6: if (UniChar < 0x80)
7: {
8: if ( OutUTFString )
9: OutUTFString[UTF8CharLength++] = (char)UniChar;
10: else
11: UTF8CharLength++;
12: }
13: else if(UniChar < 0x800)
14: {
15: if ( OutUTFString )
16: {
17: OutUTFString[UTF8CharLength++] = 0xc0 | ( UniChar >> 6 );
18: OutUTFString[UTF8CharLength++] = 0x80 | ( UniChar & 0x3f );
19: }
20: else
21: {
22: UTF8CharLength += 2;
23: }
24: }
25: else if(UniChar < 0x10000 )
26: {
27: if ( OutUTFString )
28: {
29: OutUTFString[UTF8CharLength++] = 0xe0 | ( UniChar >> 12 );
30: OutUTFString[UTF8CharLength++] = 0x80 | ( (UniChar >> 6) & 0x3f );
31: OutUTFString[UTF8CharLength++] = 0x80 | ( UniChar & 0x3f );
32: }
33: else
34: {
35: UTF8CharLength += 3;
36: }
37: }
38: else if( UniChar < 0x200000 )
39: {
40: if ( OutUTFString )
41: {
42: OutUTFString[UTF8CharLength++] = 0xf0 | ( (int)UniChar >> 18 );
43: OutUTFString[UTF8CharLength++] = 0x80 | ( (UniChar >> 12) & 0x3f );
44: OutUTFString[UTF8CharLength++] = 0x80 | ( (UniChar >> 6) & 0x3f );
45: OutUTFString[UTF8CharLength++] = 0x80 | ( UniChar & 0x3f );
46: }
47: else
48: {
49: UTF8CharLength += 4;
50: }
51:
52: }
53:
54: return UTF8CharLength;
55: }
当OutUnicodeString为NULL时, 可以进行输出的Unicode字符串长度探测
1: uint32 UTF8StrToUnicode( const char* UTF8String, uint32 UTF8StringLength, wchar_t* OutUnicodeString, uint32 UnicodeStringBufferSize )
2: {
3: uint32 UTF8Index = 0;
4: uint32 UniIndex = 0;
5:
6: while ( UTF8Index < UTF8StringLength )
7: {
8: unsigned char UTF8Char = UTF8String[UTF8Index];
9:
10: if ( UnicodeStringBufferSize != 0 && UniIndex >= UnicodeStringBufferSize )
11: break;
12:
13: if ((UTF8Char & 0x80) == 0)
14: {
15: const uint32 cUTF8CharRequire = 1;
16:
17: // UTF8字码不足
18: if ( UTF8Index + cUTF8CharRequire > UTF8StringLength )
19: break;
20:
21: if ( OutUnicodeString )
22: {
23: wchar_t& WideChar = OutUnicodeString[UniIndex];
24:
25: WideChar = UTF8Char;
26: }
27:
28: UTF8Index++;
29:
30: }
31: else if((UTF8Char & 0xE0) == 0xC0) ///< 110x-xxxx 10xx-xxxx
32: {
33: const uint32 cUTF8CharRequire = 2;
34:
35: // UTF8字码不足
36: if ( UTF8Index + cUTF8CharRequire > UTF8StringLength )
37: break;
38:
39: if ( OutUnicodeString )
40: {
41: wchar_t& WideChar = OutUnicodeString[UniIndex];
42: WideChar = (UTF8String[UTF8Index + 0] & 0x3F) << 6;
43: WideChar |= (UTF8String[UTF8Index + 1] & 0x3F);
44: }
45:
46: UTF8Index += cUTF8CharRequire;
47: }
48: else if((UTF8Char & 0xF0) == 0xE0) ///< 1110-xxxx 10xx-xxxx 10xx-xxxx
49: {
50: const uint32 cUTF8CharRequire = 3;
51:
52: // UTF8字码不足
53: if ( UTF8Index + cUTF8CharRequire > UTF8StringLength )
54: break;
55:
56: if ( OutUnicodeString )
57: {
58: wchar_t& WideChar = OutUnicodeString[UniIndex];
59:
60: WideChar = (UTF8String[UTF8Index + 0] & 0x1F) << 12;
61: WideChar |= (UTF8String[UTF8Index + 1] & 0x3F) << 6;
62: WideChar |= (UTF8String[UTF8Index + 2] & 0x3F);
63: }
64:
65:
66: UTF8Index += cUTF8CharRequire;
67: }
68: else if((UTF8Char & 0xF8) == 0xF0) ///< 1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx
69: {
70: const uint32 cUTF8CharRequire = 4;
71:
72: // UTF8字码不足
73: if ( UTF8Index + cUTF8CharRequire > UTF8StringLength )
74: break;
75:
76: if ( OutUnicodeString )
77: {
78: wchar_t& WideChar = OutUnicodeString[UniIndex];
79:
80: WideChar = (UTF8String[UTF8Index + 0] & 0x0F) << 18;
81: WideChar = (UTF8String[UTF8Index + 1] & 0x3F) << 12;
82: WideChar |= (UTF8String[UTF8Index + 2] & 0x3F) << 6;
83: WideChar |= (UTF8String[UTF8Index + 3] & 0x3F);
84: }
85:
86: UTF8Index += cUTF8CharRequire;
87: }
88: else ///< 1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx
89: {
90: const uint32 cUTF8CharRequire = 5;
91:
92: // UTF8字码不足
93: if ( UTF8Index + cUTF8CharRequire > UTF8StringLength )
94: break;
95:
96: if ( OutUnicodeString )
97: {
98: wchar_t& WideChar = OutUnicodeString[UniIndex];
99:
100: WideChar = (UTF8String[UTF8Index + 0] & 0x07) << 24;
101: WideChar = (UTF8String[UTF8Index + 1] & 0x3F) << 18;
102: WideChar = (UTF8String[UTF8Index + 2] & 0x3F) << 12;
103: WideChar |= (UTF8String[UTF8Index + 3] & 0x3F) << 6;
104: WideChar |= (UTF8String[UTF8Index + 4] & 0x3F);
105: }
106:
107: UTF8Index += cUTF8CharRequire;
108: }
109:
110:
111: UniIndex++;
112: }
113:
114: return UniIndex;
115: }
疗效: 用了此代码啊, 再也不用被iconv折磨了
跨平台Unicode与UTF8互转代码的更多相关文章
- 使用 WideCharToMultiByte Unicode 与 UTF-8互转
1.简述 最近在发送网络请求时遇到了中文字符乱码的问题,在代码中调试字符正常,用抓包工具抓的包中文字符显示正常,就是发送到服务器就显示乱码了,那就要将客户端和服务器设置统一的编码(UTF-8),而我们 ...
- Unicode与UTF-8互转(C语言实现)
1. 基础 1.1 ASCII码 我们知道, 在计算机内部, 所有的信息最终都表示为一个二进制的字符串. 每一个二进制 位(bit)有0和1两种状态, 因此八个二进制位就可以组合出 256种状态, 这 ...
- Unicode与UTF-8互转(c语言和lua语言)
1. 基础 1.1 ASCII码 我们知道, 在计算机内部, 全部的信息终于都表示为一个二进制的字符串. 每个二进制 位(bit)有0和1两种状态, 因此八个二进制位就能够组合出 256种状态, 这被 ...
- Unicode与UTF-8互转(C语言实现) 基本原理
1. 基础 1.1 ASCII码 我们知道, 在计算机内部, 所有的信息最终都表示为一个二进制的字符串. 每一个二进制位(bit)有0和1两种状态, 因此八个二进制位就可以组合出 256种状态, 这被 ...
- unicode和utf-8互转
1.1 ASCII码 我们知道, 在计算机内部, 所有的信息最终都表示为一个二进制的字符串. 每一个二进制位(bit)有0和1两种状态, 因此八个二进制位就可以组合出 256种状态, 这被称为一个字节 ...
- Linux 平台和 Windows平台下 Unicode与UTF-8互转
Windows: unsigned char * make_utf8_string(const wchar_t *unicode) { , index = , out_index = ; unsign ...
- CString与UTF8互转代码
这个代码网上很多,留在这里做个备份. static std::string ConvertCStringToUTF8( CString strValue ) { std::wstring wbuffe ...
- c++ ANSI、UNICODE、UTF8互转
static std::wstring MBytesToWString(const char* lpcszString); static std::string WStringToMBy ...
- 汉字编码(【Unicode】 【UTF-8】 【Unicode与UTF-8之间的转换】 【汉字 Unicode 编码范围】【中文标点Unicode码】【GBK编码】【批量获取汉字UNICODE码】)
Unicode与UTF-8互转(C语言实现):http://blog.csdn.net/tge7618291/article/details/7599902 汉字 Unicode 编码范围:http: ...
随机推荐
- IOS 异步GET方法请求
1.添加协议NSURLConnectionDelegate 2.引入头文件“NSString+URLEncoding”,用来处理URL进行编码. 3.引入头文件“NSNumber+Message”,用 ...
- 相似度到大数据查找之Mysql 文章匹配的一些思路与提高查询速度
文章相关度匹配的一些思路---"压缩"预料库,即提取用特征词或词频,量化后以“列向量”形式保存到数据库:按前N组词拼为向量组供查询使用,即组合为1到N字的组合,量化后以“行向量”形 ...
- (转)Linux下tomcat JVM内存设置步骤
java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: Java heap space -------------- ...
- the first blog: record my coding
try the code "hello world" #include<iostream> using namespace std; int main() { cout ...
- c++ primer (5)1
第一章 1.包含来自标准库的头文件用<>,不属于标准库用"". 2.默认情况,读cin会刷新cout:程序非正常终止时也会刷新cout. 3.默认情况,cerr不缓冲, ...
- Hibernate的单向OneToMany、单向ManyToOne
单向OneToMany 一个用户有多张照片,User----->Images是一对多关系,在数据库中Images维护一个外键useid 1.在映射关系的主控方Image这边,我们什么都不做.(为 ...
- object-c实现的 在PHP中oauth加密算法
说起这个算法,在php中我是这么实现的 function generateSig ($params, $secret = '') { if (empty($secret)) { ...
- C++中delete和delete[]的区别
C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]. 关于 new[] 和 delete[],其中又 ...
- 二十、mysql mysqldump备份工具
.备份所有数据库 mysqldump -uroot -p --all-database > c:\all.sql 备份所有数据库到c盘下的all,sql文件 .备份某个数据库 mysqldump ...
- EXTJS 4.2 资料 控件之Grid 列鼠标悬停提示
columns: [ { header: }, { header: }, { header: , renderer: function (v, ctx, record) { ctx.tdAttr = ...