C_and_CPP 板


LINE

开发平台(Platform): (Ex: Win10, Linux, ...) WindowXP Windows7 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出) Visual Studio 2010~2015 问题(Question): 我在VS上面使用档头有BOM的UTF8程式码 但是程式码上的中文最後输出都会变乱码 输出到console视窗、输出成图片、输出到支援UTF8的GUI工具上 一样的程式码在MinGW上就很正常 我觉得程式码里的中文字是被编译器转成其他编码的 因为我把中文字另外存在外部的XML等文字档上就没问题 (程式执行後才载入的字码不会被编译器更改) 请问我该修改Visual Studio上的哪个选项? 可以的话告诉我2012的做法 不然2010~2015的其中一版也可以 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.36.254.148
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1505311897.A.A7E.html
1F:→ Schottky: 你是不是忘了用 L"字串" 或是 _T("字串") 09/13 22:38
2F:→ eye5002003: 我的情况其实不该加L,但是我有试过一样不行 09/13 22:58
3F:→ Schottky: 什麽状况下处理 UTF8 字串却不该加 L ? 09/13 23:06
4F:→ eye5002003: L是宽字元,UTF8格式下的英文字还是只用8bit 09/13 23:32
5F:→ eye5002003: std::basic_string<char>不可装L"",但是可以装UTF8 09/13 23:35
6F:→ Schottky: 然後你就直接把 char 送进 ANSI API ? 这样当然是乱码 09/13 23:38
7F:→ colako: 一定要与MinGW共用的话, 把中文转成code point吧 09/14 00:03
8F:→ colako: 用VS,_UNICODE如果不存UTF-16, 直接把中文写在.cpp很麻烦 09/14 00:05
把UTF8喂进ANSI API是没有问题的,UTF8的卖点之一就是可以被当成char字串 至於Windows下std::cout跟fopen这种介面会无法吃UTF8字串则是底层实作的问题 微软只支援你用wchar_t来完成那两个功能(用WriteConsoleW跟_wfopen) 这不碍事,微软有提供MultiByteToWideChar来帮忙将UTF8转换成wchar_t字串 我的程式从外部读取UTF8文件的字串就运作的好好的 档案读取介面没道理会对外部文字做转编码处理 所以我才会认为是编译阶段被动手脚 顺带一提 我不建议_T("字串")这样的写法 现代Windows程式很少不用Unicode了 OS的资料夹名称都已经预设用Unicode储存了 _T算是旧时代过渡期留下的东西了 我现在偏向只用UTF8处理,所以也不会加L,必要时再转就行了 不然使用C++11的raw string时会很丑 ※ 编辑: eye5002003 (114.36.254.148), 09/14/2017 00:49:36
9F:→ Schottky: 不是啊你用 VS2010 然後跟我说 _T() 是旧时代的东西 09/14 00:59
10F:→ Schottky: 就像 colako 说的,VS 不用 UTF-16 会有各种问题 09/14 01:01
11F:→ a27417332: 在中文系统下,ANSI预设不是UTF-8吧 09/14 01:15
12F:→ a27417332: 我觉得可能要把输出的片段贴出来,不然感觉很难帮忙 09/14 01:19
13F:→ a27417332: 不过从外部读取可以对,感觉好像真的就是源码的问题 09/14 01:27
14F:→ Schottky: 我觉得应该说是 compiler 在处理源码编码时的问题 09/14 01:32
15F:→ james732: 不用L或_T的话不会变成big5编码吗? 09/14 09:59
16F:推 shadow0326: 在专案上右键>属性>一般>字元集改unicode看看? 09/14 11:15
17F:→ a27417332: 回Sch大:我是这个意思,不过推文有字数限制就省略了@@ 09/14 11:42
18F:→ a27417332: 不过我昨天有看到说法是VS会根据各档案BOM决定编码 09/14 11:43
_T是怕环境不支援Unicode才留的後路,你真的有这需要你就用吧Schottky a27417332其实我的UTF8程式码有在档头加BOM做为提示 VS没有误解我的中文字,只是VS自作主张改成其他编码了 MinGW跟Linux下都是继续当UTF8 我现在研究进度是发现VS把字串改成Big5了,james你说对了 我还是不知道如何叫VS让字串维持UTF8 shadow你说的修改Character set不会改变结果,VS依然输出big5 以下是个简单的测试程式,有兴趣的人可以玩玩看,只用标准库而已 #include <string> #include <fstream> // 从外部取得字串 static std::string GetString() { std::ifstream input; // in.txt 使用UTF8无BOM格式,档尾有换行字元 input.open("in.txt",std::ifstream::in); std::string str; std::getline(input,str,'\n'); return str; } int main() { // 成功输出成正确UTF8格式文件,因为VS没机会动手脚 //std::string str = GetString(); // 输出的文件总是big5格式,我改不了 std::string str = "abcd中文abc"; std::ofstream file; file.open("log.txt"); file<<str<<std::endl; return EXIT_SUCCESS; } ※ 编辑: eye5002003 (118.167.51.47), 09/14/2017 12:33:00
20F:→ LPH66: 这个选项应该是你要的答案 09/14 12:45
21F:→ LPH66: 搜寻关键字: visual studio c++ source encoding 09/14 12:47
22F:→ LPH66: 连结里也有说要怎麽在 Visual Studio 里找到那个选项 09/14 12:55
/utf-8 /source-charset:utf-8 /execution-charset:utf-8 /validate-charset 这几个全加进去也没用,VS2010依然故我 你提供的连结看起来最像答案了,连这个也没用 我可能还是乖乖的从外部读取好了 也许这选项在2015是有用的,也许 ※ 编辑: eye5002003 (118.167.51.47), 09/14/2017 13:21:30
23F:推 shadow0326: 那个测试程式在MinGW会输出UTF-8文件!? 09/14 13:46
对啊,MinGW不会改成big5 只要能阻止VS修改,VS也是一样输出UTF8文件 目前看来想要好好跨平台使用Unicode的话只能这样 1.总是使用L"str"这样的宽字元字串,有必要再转编码(留意Linux下的wchar_t是32bit) 2.像我这样从外部读取 反正多语系程式设计上常常是将文字储存在外部档案(XML或是脚本之类的) ※ 编辑: eye5002003 (118.167.51.47), 09/14/2017 14:27:04
24F:推 stucode: 我猜你想找的是 std::string str = u8"abcd中文abc"; 09/14 14:30
25F:→ stucode: 顺带一提,这是C++11的东西。预设2010不行,2015可以。 09/14 14:32
26F:→ eye5002003: 好招!我先记下来,可惜2012没支援到u8"str"这个功能 09/14 14:53
※ 编辑: eye5002003 (118.167.51.47), 09/14/2017 15:18:28 ※ 编辑: eye5002003 (118.167.51.47), 09/14/2017 15:24:03
27F:推 LPH66: 唔, 我贴的那页是给 2015 的说明, 不确定是什麽时候出现的 09/14 15:53
28F:→ LPH66: (标题下面就写了 Visual Studio 2015 了) 09/14 15:53
29F:→ a27417332: 喔喔,终於看懂问题了,不过上面也有人给解答了 09/14 16:09







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP