gcc编码格式,utf8 or GBXXXX

autumn1202 2012-03-13 03:44:10
各位高手,请教个关于gcc编码格式的问题。我查资料得到以下信息:
1. 源代码的字符集由参数-finput-charset参数决定,默认为utf8
2.“-fexec-charset”参数来指定二进制程序中,多字节串的字符集,若不指定,默认是UTF-8,我理解为char str[]="测试";中str内部的值。

现在有个测试程序



unsigned char str[20] = "ab语言";
int j;
for(j = 0; j < strlen(str); j++)
{
printf("%d ", str[j]);
}
printf("\n");



我分别用gcc -o test test.c跟gcc -finput-charset=GBK -fexec-charset=GBK -o test test.c编译,为啥得到的结果都是:
97 98 211 239 209 212
按之前的解释,默认utf8的话似乎不该是这六个字节。
哪位高手给解释下原因,谢谢了

...全文
1282 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
l9sky 2012-08-07
  • 打赏
  • 举报
回复
如果代码中没有含wchar_t宽字节类型时, 默认以文件的编码来解析
autumn1202 2012-03-15
  • 打赏
  • 举报
回复
靠了,收回这句话:
“难道gcc会先根据-finput的格式转化成UTF-8的?”

gcc -finput-charset=abc -o test test.c
报错:conversion from abc to UTF-8 not supported by iconv
就可以看出确实是这样了

目前的结论:
1. gcc会先将文件从-finput-charset配置的编码格式转化为UTF-8格式,然后在生成执行文件时再将UTF-8格式转化为-fexec-charset配置的编码格式。
2. str存储的值跟原始文件的编码格式以及-finput-charset -fexec-charset配置的编码格式有关。

过两天,没有高手有异议就结贴。
autumn1202 2012-03-15
  • 打赏
  • 举报
回复
谢谢6L的兄弟
我其实是想知道在 str[20] = "ab语言" 中str初始化的值是按什么编码格式赋值的
确定的一点是,当我用vi输入“语言”这两个字时,此时的编码格式应该是跟vi默认的编码格式一致。
用 :set encoding命令查看,vi采用的是EUC-CN,网上查了下,指的就是GB2312。然后用:set fileencoding查看,发现为空,说明vi写入文件也采用GB2312.我认为str里面存的也应该是GB2312格式。
这个时候问题来了,
我用gcc -finput-charset=UTF-8 -fexec-charset=UTF-8 -o test test.c
跟gcc -finput-charset=GBK -fexec-charset=GBK -o test test.c
得到的str是6个字节,当用gcc -finput-charset=GBK -fexec-charset=UTF-8 -o test test.c时,得到8个字节(UTF-8编码)。
问题就是,我明明输入是GB2312的,但是当我指定-finput-charset=UTF-8时,gcc应该会有个转化过程,这个时候应该是出错的(因为我文件明明是GBK的,我却指名是UTF-8的),用gcc -finput-charset=UTF-8 -fexec-charset=GBK -o test test.c测试,确实会报错:converting to execution character set: 无效或不完整的多字节字符或宽字符。但是用gcc -finput-charset=UTF-8 -fexec-charset=UTF-8就没问题。
归根到底还是对-finput-charset和-fexec-charset理解有问题。
难道gcc会先根据-finput的格式转化成UTF-8的?如果-finput本身就是UTF-8的,自然没有转化这一步。
hongwenjun 2012-03-13
  • 打赏
  • 举报
回复

-fexec-charset=gbk // 可执行文件中的中文字符资源为 GBK,控制台显示中文
-finput-charset=UTF-8 // 源代码 main.cpp 为 UTF-8编码

#include <iostream>

using namespace std;

int main()
{
cout << "你好世界!" << endl;
return 0;
}

// 输出
你好世界!



[ 50.0%] g++.exe -fexec-charset=gbk -finput-charset=UTF-8 -c D:\1myapp\CPP4\11\main.cpp -o obj\Release\main.o
[100.0%] g++.exe -o bin\Release\11.exe obj\Release\main.o -s

gcc 编译器 编译的配置文件要有 --enable-libiconv 参数才能进行 以上转码


可以执行 gcc -v 看你的gcc 支持哪些配置
$ gcc -v

使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/codeblocks/build/gcc/bin/../libexec/gcc/i686-pc-mingw32/4
.5.3/lto-wrapper.exe
目标:i686-pc-mingw32
配置为:./configure --prefix=/c/gcc --host=i686-pc-mingw32 --build=i686-pc-mingw
32 --target=i686-pc-mingw32 --with-lto-plugin --with-host-libstdcxx='-lstdc++ -l
supc++ -lm' --disable-bootstrap --disable-werror --enable-languages=c,c++,fortra
n --enable-libgomp --enable-threads=win32 --enable-lto --with-system-zlib --enab
le-libstdcxx-debug --enable-version-specific-runtime-libs --enable-fully-dynamic
-string --disable-sjlj-exceptions --with-dwarf2 --enable-libiconv --disable-symv
ers --enable-plugins --enable-cloog-backend=ppl --enable-static --disable-shared
--enable-nls --without-included-gettext --disable-win32-registry --with-pkgvers
ion=pcx32
线程模型:win32
gcc 版本 4.5.3 20110310 (prerelease) (pcx32)


mylover433 2012-03-13
  • 打赏
  • 举报
回复
文件另存为选择编码格式,我都是这样用的
另外能不能不要用10进制输出,16进制不是看起来舒服点吗?
autumn1202 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luciferisnotsatan 的回复:]
引用 2 楼 autumn1202 的回复:

应该是第二条理解错误,目前的猜测是str存储的跟文件的编码格式一致。继续测试ing

GCC应该没有聪明到能把你文件存储的GB转成utf-8吧,然后再编译。
[/Quote]

那-finput-charset跟-fexec-charset作用是什么呢,貌似是有个转化过程
luciferisnotsatan 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 autumn1202 的回复:]

应该是第二条理解错误,目前的猜测是str存储的跟文件的编码格式一致。继续测试ing
[/Quote]
GCC应该没有聪明到能把你文件存储的GB转成utf-8吧,然后再编译。
autumn1202 2012-03-13
  • 打赏
  • 举报
回复
应该是第二条理解错误,目前的猜测是str存储的跟文件的编码格式一致。继续测试ing
autumn1202 2012-03-13
  • 打赏
  • 举报
回复
补充下:后来我随便指定一个错误的编码方式 abc:
gcc -fexec-charset=abc -o test test.c
报错:
cc1: conversion from UTF-8 to abc not supported by iconv
说明默认确实是UTF-8,但是为什么在str里存储的汉字不是对应的UTF-8码,无限纳闷ing……

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧