UCS-2与UTF8之间的选择(4)--linux中各编码字符串的C/C++输出支持及方式比较
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
讨论新闻组及文件
继续研究UTF8和UCS-2的选择,这里继续使用上一次提到的函数。
鉴于大家不一定能找到下载的地址,而源文件是允许自由散发的,我将代码打包,提供给大家下载,下载地址还是在讨论新闻组及文件中,名字为unicodeorg.rar,
昨天看了下Windows下的方法,这次研究Linux下的:
1 #include <stdio.h>
2 #include <locale.h>
3 #include <stdlib.h>
4 #include "ConvertUTF.h"
5
6 intmain(intargc, char* argv[])
7 {
8
9 ConversionResult result = sourceIllegal;
10 UTF16 utf16_buf[3] = {0};
11 utf16_buf[0] = 0x4e2d;
12 utf16_buf[1] = 0x6587;
13 utf16_buf[2] = 0;
14 UTF16 *utf16Start = utf16_buf;
15 UTF8 utf8_buf[12] = {0};
16 UTF8* utf8Start = utf8_buf;
17
18 // If you want to test next line, you can't get anything but ???
19 // wprintf("%s/n", utf16_buf);
20
21 result = ConvertUTF16toUTF8((constUTF16 **) &utf16Start, &(utf16_buf[3]), &utf8Start, &(utf8_buf[12]), strictConversion);
22 switch(result) {
23 default:fprintf(stderr, "Test02B fatal error: result %dfor input %08x/n", result, utf16_buf[0]); exit(1);
24 caseconversionOK: break;
25 casesourceExhausted: printf("sourceExhausted/t"); exit(0);
26 casetargetExhausted: printf("targetExhausted/t"); exit(0);
27 casesourceIllegal: printf("sourceIllegal/t"); exit(0);
28 }
29
30 inti = 0;
31 for(; i < 12; ++i)
32 {
33 printf("%x", utf8_buf[i]);
34 }
35
36 printf("/n");
37
38 printf("%s/n", (char*)utf8_buf);
39 bzero(utf16_buf, sizeof(utf16_buf));
40
41 UTF8* utf8End = utf8Start;
42 utf8Start = utf8_buf;
43 utf16Start = utf16_buf;
44
45 result = ConvertUTF8toUTF16((constUTF8 **) &utf8Start, utf8End, &utf16Start, &(utf16_buf[3]), strictConversion);
46 switch(result) {
47 default:fprintf(stderr, "Test02B fatal error: result %dfor input %08x/n", result, utf16_buf[0]); exit(1);
48 caseconversionOK: break;
49 casesourceExhausted: printf("sourceExhausted/t"); exit(0);
50 casetargetExhausted: printf("targetExhausted/t"); exit(0);
51 casesourceIllegal: printf("sourceIllegal/t"); exit(0);
52 }
53
54 // If you want to test next line, you can't get anything
55 wprintf("%s/n", utf16_buf);
56
57 return0;
58 }
59
运行结果:
e4 b8 ad e6 96 87 0 0 0 0 0 0
中文
这里和Windows中不同的就是输出UTF-8的字符串在Linux下甚至不需要通过setlocale设置环境变量,这样对于C++的输出估计还是有好处的:),起码不会去影响到C++的正常输出。但是,对于宽字节的输出没有办法成功,就算你像在Windows中设置locale也没有用,道理也很简单,因为Linux下的locale我就是设置成UTF-8的-_-!
1 #include <stdio.h>
2 #include <locale.h>
3 #include <stdlib.h>
4 #include <iostream>
5 #include "ConvertUTF.h"
6 usingnamespacestd;
7
8 intmain(intargc, char* argv[])
9 {
10 ConversionResult result = sourceIllegal;
11 UTF16 utf16_buf[3] = {0};
12 utf16_buf[0] = 0x4e2d;
13 utf16_buf[1] = 0x6587;
14 utf16_buf[2] = 0;
15 UTF16 *utf16Start = utf16_buf;
16 UTF8 utf8_buf[12] = {0};
17 UTF8* utf8Start = utf8_buf;
18
19 result = ConvertUTF16toUTF8((constUTF16 **) &utf16Start, &(utf16_buf[3]), &utf8Start, &(utf8_buf[12]), strictConversion);
20 switch(result) {
21 default:fprintf(stderr, "Test02B fatal error: result %dfor input %08x/n", result, utf16_buf[0]); exit(1);
22 caseconversionOK: break;
23 casesourceExhausted: printf("sourceExhausted/t"); exit(0);
24 casetargetExhausted: printf("targetExhausted/t"); exit(0);
25 casesourceIllegal: printf("sourceIllegal/t"); exit(0);
26 }
27
28 inti = 0;
29 for(; i < 12; ++i)
30 {
31 printf("%x", utf8_buf[i]);
32 }
33
34 printf("/n");
35
36 cout << (char*)utf8_buf <<endl;
37 bzero(utf16_buf, sizeof(utf16_buf));
38
39 UTF8* utf8End = utf8Start;
40 utf8Start = utf8_buf;
41 utf16Start = utf16_buf;
42
43 result = ConvertUTF8toUTF16((constUTF8 **) &utf8Start, utf8End, &utf16Start, &(utf16_buf[3]), strictConversion);
44 switch(result) {
45 default:fprintf(stderr, "Test02B fatal error: result %dfor input %08x/n", result, utf16_buf[0]); exit(1);
46 caseconversionOK: break;
47 casesourceExhausted: printf("sourceExhausted/t"); exit(0);
48 casetargetExhausted: printf("targetExhausted/t"); exit(0);
49 casesourceIllegal: printf("sourceIllegal/t"); exit(0);
50 }
51
52 return0;
53 }
54
直接可以获得
e4 b8 ad e6 96 87 0 0 0 0 0 0
中文
的输出,也不需要调用C++的locale(imbue)函数去改变流的状态,甚至可以说,使用了UTF-8不仅仅是对ASCII完全的兼容了,对于新添加的字符也是可以不改变任何代码就做到兼容的,这点给我印象深刻。难怪UTF-8虽然是变长的编码方式,但是还是获得了这么广范围的应用。
这样的情况下,在Linux下同时在C 和 C++中使用UTF-8输出中文也不会有任何冲突,这个优势比在Windows下大多了。
另外,有个很重要的问题需要提及的就是,目前我使用的Ubuntu8.04桌面版,不支持全Unicode的编码,似乎中文是没有什么问题,但是以前那几个太玄经的字符是输出不了的,可能其Unicode的支持只到到BMP这一层,这点比Windows稍逊色。以前测试过,的确是输出不了,但是源代码已经被覆盖了,大家可以自己去确定一下:)
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
分享到:
相关推荐
身份证读卡器生成的基本信息TEXT文件,由于是采用 GB 13000 的 UCS-2 编码格式,java读取出来是乱码,这个段代码就是解决转码问题的,亲测可用
将ucs-2转换为utf-8代码集完整版
很多人喜欢用CString 或std:string,但是他们的缺点是不能完成汉字各种类型之间的转换,提供三种类库ascString,ucsString,utfString以及工具utfCount,utf8_ucs2_t,tcf8_ucs4_t类库,用于各种字符串之间的直接转换`...
用于转换字符编码的库。 在单个C文件中。 支持编码: ASCII码 美国ASCII 8859-1 ISO-8859-1 UTF8 UTF-8 UTF16 UTF-16 UTF16BE UTF-16BE UTF16LE UTF-16LE UTF32 UTF-32 UTF32BE UTF-32BE UTF32LE ...
汉字UCS-2编码表.doc
1,消息编码与解码 1),用C实现7-bit编码和解码的算法 2),用C实现UCS2编码和解码的算法 2,消息的发送(PDU编解码) 1),发送短消息 2),读取短消息 3),删除短消息 3,串口读写短信
详细描述UTF8和UCS2的 编码规则,并附带互相转换的c++源代码
发送中文短信,会用到UCS2编码,很多网友反应中文发送和接收乱码,这个烦恼可以解决了。 注意:要在系统配置里增加 LANG=zh_CN.GB18030 export LANG 语言配置不对,这个函数会出错的,另外,例子有点问题,换一个...
这个库包括ascString、ucsString和utfString类,以及用于各种字符串类型之间转换的utfCount、utf8_ucs2_t和utf8_ucs4_t工具。这些工具和类库使得在处理中文字符串时更加简单,包括字符类型之间的转换、操作和统计等...
UCS-2 UCS-4 中文字符编码 TTF字库之间地关系.doc
GB2312,UTF8,UCS2汉字编码生成与转换
字符编码转换的工具(根据3GPP 03.38,11.11附录等协议),可以把字符转换成ascii,8 bit,7 bit,UCS2,UTF-8编码。 在做手机软件开发的时候,调试WMS,Phone book,STK等模块可能会用的到。
// GB2312的编码为两个字节,转UTF编码后有3个字节,转UCS编码有2个字节。 // Unicode编码会用UCS-BIG或者UCS-LITTLE(大端或者小端),它们的区别就是高低字节位置不同。 //比如中文编码 // “哈”: // GB2312 0xB...
VX客户Duan使用的是unicode编码(utf-16le),检测出emoji表情字符或易不能显示的字符,对其使用UCS-4进行编码(使用易自带的编码转换库)。示例:。原始文本: 。android数据:{ 4, 226, 100, 0, 97, 0, 42, 227, 118,...
ucs2/7bit/8bit/ASCII/ UTF-8与中文(英文)间自由切换,粘贴自动切换。对短信开发有用。
utf-8 库,包括ascString ucsString utfString utfCount utf8_ucs2_t utf8_ucs4_t等,更新后提供LIB和.a文件两个类库,支持跨平台
嵌入式字符编码(经典)(ucs2,+unicode,+utf8,+gb2312)[借鉴].pdf
UCS utf8编码转化大全~~~各种编码形式转换
各种编码规则及用法介绍,便于开发人员对其概念的理解。