您的位置:首页 > 其它

gcc编译参数指定编码格式

2016-11-18 12:10 309 查看
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”参数来指定二进制程序中,多字节串的字符集,这样,编译后的二进制程序的字符集可以和源代码的字符集不一样。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: