vs2010 编译utf-8格式的代码总报错

带着小牛捉泥鳅 2011-07-26 07:21:13
情况如下:vs2010版本:10.0.30319.1 RTMRel,.cpp文件编码为utf-8,里面有中文,目的是在windows下编译,然后直接可以拿到Linux下编译。现在在vs2010中编译出错,如下:

>DevOperation\PipeControl.cpp : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>d:\work\w8-m342_interface_include_connectreader\connectsmartcard\connectsmartcard\devoperation\PipeControl.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>d:\work\w8-m342_interface_include_connectreader\connectsmartcard\connectsmartcard\devoperation\PipeInterface.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>d:\work\w8-m342_interface_include_connectreader\connectsmartcard\connectsmartcard\devoperation\PipeInterface.h(45): error C2059: 语法错误:“<class-head>”
1>d:\work\w8-m342_interface_include_connectreader\connectsmartcard\connectsmartcard\devoperation\PipeInterface.h(45): error C3805: “<class-head>”: 意外标记,应输入“}”或者“,”
1>D:\boost\boost_1_46_0\boost/smart_ptr/scoped_array.hpp(23): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>D:\boost\boost_1_46_0\boost/smart_ptr/scoped_array.hpp(23): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
1>D:\boost\boost_1_46_0\boost/smart_ptr/shared_array.hpp(51): error C2143: 语法错误 : 缺少“;”(在“<”的前面)



PipeInterface.h(45): 代码如下

该编码方式为utf-8不带签名,如果改成带签名的utf-8则编译没问题,但是放在linux系统下gcc又编译出错,各位大哥有没有什么好得解决方法?
...全文
3011 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ustb_diego 2013-08-02
  • 打赏
  • 举报
回复
我也遇到同样的问题:采用utf-8编码 1。即使把vs设置为识别 NO BOM,文本显示没有问题,但编译还是有问题。通过预编译可以看到。 问题在于有时候,比如: class A { int a; //测试(utf-8编码会显示乱码,如果解释不好的情况会把下一行作为注释处理) int b; (这一行可能会被解释为注释) } 那么,预编译出来的效果是: class A { int a; } 2.解决办法:注释都这样写 /*(空格) 测试(空格)*/ 这样,虽然显示是中文乱码,但不会出现上述编译问题。 我的项目是utf-8编码,由于linux、windows都要编译,现在正在痛苦的修改注释中。。。
Jonix 2012-12-12
  • 打赏
  • 举报
回复
遇到相同问题,顶一下。。。
o_wild 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
vc 编译器没有强制指定编码的选项?
[/Quote]试试,/D"_MBCS" ,或许能解决。
chai2010 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bokutake 的回复:]

没啥好办法,是GCC的问题,4.4.0以前的GCC是不能识别UTF-8的BOM的。不知道楼主用的是什么版本的系统。
我用的Fedora 15,已经是GCC 4.6了。
如果你不想升级编译器,只能用下面这种方法来半自动地删除BOM。
http://9rivers.linkka.com/2010/03/22/compile-utf8-source-in-vc-and-gcc/
VS因为为了W……
[/Quote]

BOM开始是为了区别大端/小端的字节顺序问题, 而UTF8在各种系统中
字节排列顺序是一致的, 因此就没有BOM的概念.

UTF8的好处就是兼容ASCII码, 如果加了BOM的就不能算兼容ASCII码的UTF8了!
如果可以不兼容ASCII码(带了BOM), 那还不如直接用带BOM的UTF16!

说到底这个是VS的问题:
在中文环境下, VS默认是GBK编码, 这个和UTF8是冲突的,
因此, 要多一个所谓的BOM来识别UTF8(其实是画蛇添足).
辰岡墨竹 2011-07-26
  • 打赏
  • 举报
回复
VS的编译器对Unicode源代码支持如下:

UTF-16 little endian with or without byte order mark (BOM)

UTF-16 big endian with or without BOM

UTF-8 with BOM
辰岡墨竹 2011-07-26
  • 打赏
  • 举报
回复
应该没有,MSDN貌似没有提到。
自由建客 2011-07-26
  • 打赏
  • 举报
回复
vc 编译器没有强制指定编码的选项?
辰岡墨竹 2011-07-26
  • 打赏
  • 举报
回复
没啥好办法,是GCC的问题,4.4.0以前的GCC是不能识别UTF-8的BOM的。不知道楼主用的是什么版本的系统。
我用的Fedora 15,已经是GCC 4.6了。
如果你不想升级编译器,只能用下面这种方法来半自动地删除BOM。
http://9rivers.linkka.com/2010/03/22/compile-utf8-source-in-vc-and-gcc/
VS因为为了Windows经常要和ANSI编码(可能是ASCII,也可能混合GBK等多字节编码)区分,所以要求UTF-8之前必须有BOM。Linux因为全盘UTF-8化,UTF-8又和ASCII兼容,而GCC设计者多数也只用英文在程序里,结果好几年Linux只用没有BOM的UTF-8。起始这里处处体现着Linux开发缺乏统一长远计划。Windows因为较早接触国际市场,很早就遇到各种本地编码的问题,所以这方面比较明智(要求UTF-8加BOM)。Linux则对付本地编码的情况不多,所以会有兼容性问题。
  • 打赏
  • 举报
回复
我在是在linux/eclipse中编译的,它默认的是utf-8,我不想再改动它的配置,呵呵
ningto.com 2011-07-26
  • 打赏
  • 举报
回复
为什么不用unicode?

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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