gcc编译参数指定编码格式

来源:互联网 发布:粒子群算法的gui 编辑:程序博客网 时间:2024/06/06 21:01

gcc 编译时程序编码控制
【GCC关于编译后字符串的保存方式的相关参数】 先了解一下GCC关于编译后字符串的保存方式的参数。 GCC编译时可以使用如下参数:
-finput-charset 指定源文件的编码(若不指定,默认是UTF-8)
-fexec-charset 指定多字节字符串(const char*)常量在编译后的程序里保存的编码集(若不指定,默认是UTF-8)
-fwide-exec-charset 指定宽字节字符串(const wchar_t*)常量在编译后的程序里的保存的编码集

 如: gcc TestMain.cpp -g -finput-charset=GB2312 -fexec-charset=GB2312

【源代码中含有宽字节字符串的情况】 测试代码: (TestMain.cpp, 编码:GB2312)
void ShowBuffer(const char *prompt, const void *buffer, size_t bufferSize)
{
 printf(“%s: “, prompt);
 const unsigned char byteBuffer = (const unsigned char)buffer;
 size_t i;
 for (i = 0; i < bufferSize; i++)
 {
    printf(“%02x “, byteBuffer[i]);
 }
 printf(“\n”);
}

int main(void)
{
char str[] = “中文”;
wchar_t wstr[] = L”中文”;
ShowBuffer(“str[]”, str, sizeof(str));
ShowBuffer(“wstr[]”, wstr, sizeof(wstr));
return 0;
}
下面列出的是不同环境下编译后的运行结果:
1. Windows
(1) VC6.0编译:
str[]: d6 d0 ce c4 00 wstr[]: 2d 4e 87 65 00 00
2 Linux GCC
(1) gcc TestMain.cpp
TestMain.cpp:24:19: converting to execution character set: Invalid or incomplete multibyte or wide character (第24行的内容为“wchar_t wstr[] = L”中文”;”)
 
(2) gcc TestMain.cpp  -finput-charset=GB2312
str[]: e4 b8 ad e6 96 87 00 wstr[]: 2d 4e 00 00 87 65 00 00 00 00 00 00

(3) gcc TestMain.cpp  -finput-charset=GB2312 -fexec-charset=GB2312
str[]: d6 d0 ce c4 00 wstr[]: 2d 4e 00 00 87 65 00 00 00 00 00 00

(4) gcc TestMain.cpp  -finput-charset=GB2312 -fexec-charset=GB2312 -fwide-exec-charset=GB2312

str[]: d6 d0 ce c4 00 wstr[]: d6 d0 ce c4 00 00 00 00

(5) gcc TestMain.cpp  -finput-charset=GB2312 -fexec-charset=GB2312 -fwide-exec-charset=UCS-4BE

str[]: d6 d0 ce c4 00 wstr[]: 00 00 4e 2d 00 00 65 87 00 00 00 00

 通过上面的结果我们可以得到如下结论:
1) 对于多字节字符串,Windows下编译出来的程序,字符串在编译后的程序里的存储编码与源代码相同:源代码是GB2312,则编译后的代码也是GB2312;
2) 对于宽字节字符串,Windows总是在编译时,根据编译机器的字符集设置,将源代码中的宽字节字符串转换成Unicode(UCS2-LE);
3) 而在Linux下,源代码的字符集由参数-finput-charset参数决定;
4) 在Linux下,如果源代码中出现了宽字节字符串常量,则在编译时必须带“-finput-charset”参数和“-fexec-charset参数”;而“-fwide-exec-charset参数可以省略”(省略该参数时,默使用UCS-4LE的Unicode编码保存);
5) Linux下可以使用“-fexec-charset”参数来指定二进制程序中,多字节串的字符集,这样,编译后的二进制程序的字符集可以和源代码的字符集不一样。
 

原文
字符理论–hzk16的介绍以及简单的使用方法

原创粉丝点击