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/m.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燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP