跨平台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: ...
随机推荐
- Swift静态方法
与静态属性类似,Swift中还定义了静态方法,也称为类型方法,所谓“类型”是指枚举.结构体和类.静态方法定义的方法也是与静态属性类似的,枚举和结构体的静态方法使用的关键字是static,类的静态方法使 ...
- C# to Maxscript
I figured I’d do a quick tutorial about something a little more difficult, but still very important. ...
- NodeJS文件读取:感恩常在--抓把糖果,愉悦客人
通过上一篇文章“NodeJS服务器:一行代码 = 一个的HTTP服务器”,我们已经开启了NodeJS之旅,开发了一个监听在8000端口的HTTP服务器,虽然功能很简单,但是,已经让我们感受到用Node ...
- JAVA:避免重复的创建对象
在实际开发中,重复使用同一个对象要比每次需要的时候就创建一个对象要好的多: 作为一个比较极端的反面例子,看下面这个语句: String s = new String("haha") ...
- pickle模块的基本使用
pickle是python的biult-in模块: python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储 ...
- htm5实现视差动画
requestAnimationFrame.js window.requestAnimFrame = (function() { return window.requestAnimationFrame ...
- [摘抄] 为什么 Linq 可以高效率查询 SQL ?
From C# in Depth(3rd) - Jon Skeet using (LinqDemoDataContext db = new LinqDemoDataContext()) { var f ...
- Java常见知识问答
1.String.StringBuilder.StringBuffer (1).String是字符串常量,不允许改变 (2).StringBuffer先开辟了一块空间,可以允许改变,即向这个空间添加值 ...
- manifest save for self
一.使用html5的缓存机制 1.先上规则代码:m.manifest CACHE MANIFEST # 2015-04-24 14:20 #直接缓存的文件 CACHE: /templates/spec ...
- 压力测试工具siege的用法
Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续请求的压力测试. 安装 Siege 01 02 03 04 #wget h ...