Win、Linux 平台下的源程序文件编码格式问题

2015-11-23 17:29:05 +08:00
 patrickstar
目前写的 C/C++源程序都是在 linux 下编辑、编译链接的,源文件(有中文字符)都是 UTF-8 编码。

但是这些源代码同时需要给别人在 Windows 的 VS2010 和 VS2013 中使用(平台相关代码已在源程序中做了条件控制),但是 VS 2010 的编译器根本不认 UTF-8 编码,网上看了一圈也一头雾水,请问有没有有经验的同仁给出一个解决方案啊,实在不想一个一个格式去实验验证了
2606 次点击
所在节点    Linux
13 条回复
bdbai
2015-11-23 18:22:24 +08:00
全部加上 BOM 头试试。
vanxining
2015-11-23 18:57:00 +08:00
@bdbai
正解,虽然一个很恶心的办法(违背了“文本文件”的定义)。
GCC 现在也认带 BOM 的文件了。
bdbai
2015-11-23 19:04:48 +08:00
@vanxining 写 PHP 的时候被坑得不轻,拿去编译的问题应该不大。
如果用 Git 也能避免编码问题。
lianz
2015-11-23 19:13:33 +08:00
部分源码管理工具可以设置在签出的时候转换成本地格式。比如 Git
patrickstar
2015-11-23 19:16:22 +08:00
@bdbai
@vanxining
@bdbai
@lianz
谢谢,看来只能 UTF-8 with BOM 了,只要 gcc/g++认识和 cl/link 认识就行
看来一下子 http://www.cnblogs.com/findumars/p/3620078.html ,只是很纠结!
bdbai
2015-11-23 19:23:10 +08:00
@patrickstar 不做网页有 BOM 问题也不大。建议用 Git 。
hualuogeng
2015-11-23 19:57:59 +08:00
@vanxining 老版本的 GCC 还是不认识的,前几天还专门为此问题转换过源代码
patrickstar
2015-11-23 20:26:29 +08:00
我最近才发现,跨平台下系统 API 和 C/C++函数库反而容易解决,而一个源程序编码搞得特别纠结!

准备用 Python 写一个程序来自动转编码,还得先去学习编码格式的东西,把 UTF-8 自动转换为 UTF-8 with BOM ,否则一个一个转换太烦人了
Arthur2e5
2015-11-24 03:38:06 +08:00
@patrickstar 其实你都不需要写 py 呢……
```Bash
shopt -s globstar nullglob
for i in **/*.c **/*.h; do
mv "$i"{,.old}
printf '\xEF\xBB\xBF' | cat - "$i.olg" > "$i"
done
```
甚至 ed + find: `find . -name '*.c' -o -name '*.c ’ -exec ed -e $'0a\n\xEF\xBB\xBF\n.\nw\nq'`(原谅我的 ed 恶趣味,毕竟 sed 还是不大会用……)
patrickstar
2015-11-24 07:39:45 +08:00
@Arthur2e5 谢谢,厉害
Arthur2e5
2015-11-24 10:00:35 +08:00
@patrickstar 我现在看回来想起来 ed 没有 -e ,还是用 ex -c 吧((((
iamfredng
2015-12-01 16:55:46 +08:00
@Arthur2e5 你这个有问题啊。已经有 BOM 头的就被搞了。
Arthur2e5
2015-12-02 12:47:04 +08:00
@iamfredng 我本来是想说单向不考虑 BOM 转换的。一致化的话其实也不麻烦,按照 sed 的话就是 -e '0s/\x 那啥啥 //1' -e '0a 补上去' 之类的……(总之先去掉再喂回去那个意思啦(我还是不会 sed …

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/238300

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX