鍍金池/ 問(wèn)答/C++/ vs2017使用cout亂碼,使用printf正常輸出

vs2017使用cout亂碼,使用printf正常輸出

問(wèn)題描述

vs2017使用cout亂碼,使用printf正常輸出

問(wèn)題出現(xiàn)的平臺(tái)版本及自己嘗試過(guò)哪些方法

修改vs源文件為gbk和utf但還是亂碼

相關(guān)代碼

#include<cstdio>
#include<iostream>
int main() {
    std::cout << "我" << std::endl;
    printf("我是\n");
    system("pause");
    return 0;
}

結(jié)果

clipboard.png

回答
編輯回答
枕頭人

在 C++ 中,除了 ASCII 字符外的字符為寬字符,需要使用 L 標(biāo)識(shí)。而寬字符流有特定的輸出流,為 std::wcout。所以,正確的輸出方式為 std::wcout << L"你好" << std::endl。

另外,還需要涉及到 std::locale 的概念。std::locale 代表地域各個(gè)設(shè)定的集合。locale 文檔

每個(gè)輸入輸出流可以與一個(gè) std::locale 進(jìn)行綁定,默認(rèn)綁定為 std::locale("C")。此處使用 std::wcout.imbue( locale ),需要設(shè)定的地域?yàn)?zh-cn,我沒(méi)有查到相關(guān)的內(nèi)容,這個(gè)地域字符串可能跟環(huán)境有關(guān)系。

最終代碼為:

#include <cstdio>
#include <locale>
#include <string>
#include <iostream>

int main() {
    auto old_locale = std::wcout.imbue(std::locale("zh-cn"));
    std::wcout << L"你好" << std::endl;

    std::cout << "old locale: " << old_locale.name() << std::endl;
    auto new_locale = std::wcout.imbue(old_locale);
    std::cout << "new locale: " << new_locale.name() << std::endl;

    printf("你好\n");

    system("pause");
}

輸出為:

你好
old locale: C
new locale: zh-cn
你好

這部分內(nèi)容較繁雜,我也沒(méi)有很了解,希望能對(duì)你有幫助。

2018年1月25日 15:27
編輯回答
朕略傻

字符集設(shè)置改成多字符試試看。
General->Character Set->Use Multi-Byte Character Set.(VS2010)

2018年8月7日 03:17
編輯回答
孤巷

沒(méi)有遇到過(guò)這種情況。你調(diào)試一下看看。

2017年1月20日 18:35
編輯回答
你好胸

試了之后仍然沒(méi)用

2017年5月4日 15:40