user-0 提问: GCC编译器遇到繁体中文字符串解析错误

回复:
user: user-1
content: 引用 14 楼 qq_22963489 的回复:我使用HEX工具查看对应文件引号中内容（繁體中文）的原始值为： e7 b9 81 e9 ab 94 e4 b8 ad e6 96 87   您所说的其他2个工具没用过，不大会用。也不只能否使用在我这个平台上，目前我这个使用的是ecos系统。 // UTF-8 编码字符理论上可以最多到 6个字节长，但目前全世界的所 // 有文字和符号种类加起来也只要编到 4个字节长就够了。 // 　　UTF-8 是以 8位（即 1个字节）为单元对原始码进行编码（注意一 // 点：这里所讲的原始码都是指Unicode码），并规定：多字节码（2个字 // 节以上才称为多字节）以转换后第1个字节起头的连续“1”的数目（这 // 些连续“1”称为标记位），表示转换成几个字节：“110”连续两个 // “1”，表示转换结果为2个字节，“1110”表示3个字节，而“11110” // 则表示4个字节……跟随在标记位之后的“0”，其作用是分隔标记位和 // 字符码位。第2～第4个字节的起头两个位固定设置为“10”，也作为标 // 记，剩下的6个位才做为字符码位使用。 // 　　这样，2字节UTF-8码剩下11个字符码位，可用以转换0080～07FF的 // 原始字符码，3字节剩下16个字符码位，可用以转换0800～FFFF的原始字 // 符码，由此类推。编码方式的模板如下： // // 原始码（16进制）　UTF－8编码（二进制） // -------------------------------------------- // 0000 - 007F       0xxxxxxx // 0080 - 07FF       110xxxxx 10xxxxxx // 0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx // …… // -------------------------------------------- // // 　　模板中的“x”表示字符码。 // 　　Ascii码＜007F，编为1个 // 字节的UTF－8码。汉字的 Unicode编码范围为0800－FFFF，所以被编为 // 3个字节的UTF－8码。 // 　　例如“汉”字的Unicode编码是6C49，6C49在0800-FFFF之间，所以 // 要用3个字节的模板：1110wwww 10xxxxyy 10yyzzzz。  //    6    C    4    9 // 0110 1100 0100 1001 // wwww xxxx yyyy zzzz //     wwww   xxxxyy   yyzzzz // 1110wwww 10xxxxyy 10yyzzzz。 // 11100110 10110001 10001001 //    E   6    B   1    8   9 //“汉”字的UTF-8编码是E6 B1 89

user: user-0
content: 我将 wcscpy(string_buffer,(U16*)"繁體中文"); 修改成 wcscpy(string_buffer,(U16*)L"繁體中文"); 的输出结果是 [7e41][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] 也就是只能输出第一个字（繁）。经过我反复测试不管第一个字是什么字都是只输出第一个字。 请问是什么原因呢？有办法解决么~

user: user-0
content: 我使用HEX工具查看对应文件引号中内容（繁體中文）的原始值为： e7 b9 81 e9 ab 94 e4 b8 ad e6 96 87   您所说的其他2个工具没用过，不大会用。也不只能否使用在我这个平台上，目前我这个使用的是ecos系统。

user: user-1
content: #include <stdio.h> #include <string.h> #define U16 wchar_t U16 string_buffer[30]; int i; int main() {     memset(string_buffer,0,sizeof(U16)*30);     wcscpy(string_buffer,(U16*)L"繁體中文");     for (i=0;i<30;i++) {         printf("[%04hx]",string_buffer[i]);     }     return 0; } //[7e41][9ad4][4e2d][6587][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000][0000]

user: user-1
content: VC6没问题。 使用gdb查看每句C对应的汇编代码。 使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-1
content: gcc是开源的，可以给其打个补丁。 或者让你的源代码使用UTF8编码保存汉字。

user: user-1
content: wcscpy(string_buffer,(U16*)L"繁體中文");

user: user-2
content: 为何一定要用繁体字？

user: user-0
content: 我写了个测试小程序 //////////////////////////////////////////////// 	memset(string_buffer,0,sizeof(U16)*30); 	wcscpy(string_buffer,(U16*)"繁體中文"); 	printf("\n"); 	for(i=0 ; i<30;i++) 	{ 		printf("[%x]",string_buffer[i]); 	} //////////////////////////////////////////////////// 当以ANSI编码时输出结果为 [b1b7][e5cc][d0d6][c4ce][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] 当以UTF-8 无BOM格式编码时输出结果为 [b9e7][e981][94ab][b8e4][e6ad][8796][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] 但是我所需的真实输出结果应该是 [7e41][9ad4][4e2d][6587][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] 然道真的只是编码格式问题么？感觉是否还有其他错误啊？

user: user-3
content: utf保存就行了，写个小程序，岂不又多了一套代码？

user: user-1
content: 或者自己编个小程序，将 "謀"替换为"\xd6\x5c" "齖"替换为"\xfd\x5c" "診"替换为"\xd4\x5c"

user: user-1
content: 换Notepad再试试？

user: user-0
content: 请问如何查看源码字符集呢？我使用Notepad++ 打开在格式中显示的是“ANSI格式编码” 然后将格式改成UTF-8保存后编译错误是一样的。

user: user-4
content: 你的源码字符集是用的什么，UTF8、GB18030、Big-5还是其他？？  GCC默认是UTF8字符集，如果用的其他字符集，你需要指定 input charset

user: user-5
content: 源码以utf-8保存。