第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Windows控制臺應(yīng)用程序中輸出Unicode字符串

在Windows控制臺應(yīng)用程序中輸出Unicode字符串

C++ C
PIPIONE 2019-06-10 16:35:20
在Windows控制臺應(yīng)用程序中輸出Unicode字符串嗨,我試圖將Unicode字符串輸出到控制臺碘流但失敗了。我發(fā)現(xiàn)了這個:在c+控制臺應(yīng)用程序中使用Unicode字體這個片段很管用。SetConsoleOutputCP(CP_UTF8);wchar_t s[] = L"èé?T?л?Σ??a";int bufferSize = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL); char* m = new char[bufferSize]; WideCharToMultiByte(CP_UTF8, 0, s, -1, m, bufferSize, NULL, NULL);wprintf(L"%S", m);但是,我沒有找到任何方法來正確輸出ioStreams的Unicode。有什么建議嗎?這是行不通的:SetConsoleOutputCP(CP_UTF8);utf8_locale = locale(old_locale,new boost::program_options::detail::utf8_codecvt_facet()); wcout.imbue(utf8_locale);wcout << L"?Hola!" << endl;編輯我找不到任何其他的解決方案,只能把這個片段包在一個流里。希望有人有更好的主意。//Unicode output for a Windows console ostream &operator-(ostream &stream, const wchar_t *s) {      int bufSize = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL);     char *buf = new char[bufSize];     WideCharToMultiByte(CP_UTF8, 0, s, -1, buf, bufSize, NULL, NULL);     wprintf(L"%S", buf);     delete[] buf;      return stream; } ostream &operator-(ostream &stream, const wstring &s) {      stream - s.c_str();     return stream; }
查看完整描述

3 回答

?
慕無忌1623718

TA貢獻1744條經(jīng)驗 獲得超4個贊

我在這里使用VisualStudio 2010驗證了一個解決方案。通過這個MSDN文章MSDN博客文章..訣竅是對_setmode(..., _O_U16TEXT).

解決辦法:

#include <iostream>#include <io.h>#include <fcntl.h>int wmain(int argc, wchar_t* argv[]){
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wcout << L"Testing unicode -- English -- Ελληνικ? -- Espa?ol." << std::endl;}


查看完整回答
反對 回復(fù) 2019-06-10
?
偶然的你

TA貢獻1841條經(jīng)驗 獲得超3個贊

中文Unicode Hello World

這里是中文的“你好世界”。其實只是“你好”。我在Windows 10上測試了這一點,但我認為它可能會在WindowsVista之后工作。在WindowsVista之前,如果您想要一個編程解決方案,而不是配置控制臺/注冊表等,這將是很困難的。如果您真的需要在Windows 7上這樣做,請看這里:更改控制臺字體Windows 7

我不想說這是唯一的解決辦法,但這才是對我有用的。

提綱

  1. Unicode項目設(shè)置
  2. 將控制臺代碼頁設(shè)置為Unicode
  3. 查找并使用支持要顯示的字符的字體。
  4. 使用要顯示的語言的區(qū)域設(shè)置。
  5. 使用寬字符輸出,即

    std::wcout

1項目設(shè)置

我正在使用VisualStudio2017 CE。我創(chuàng)建了一個空白控制臺應(yīng)用程序。默認設(shè)置沒有問題。但是,如果您遇到問題或使用了不同的ide,您可能需要檢查以下內(nèi)容:

在項目屬性中找到配置屬性->General->Project Default->字符集。應(yīng)該是“使用Unicode字符集”,而不是“多字節(jié)”。這將定義_UNICODEUNICODE預(yù)處理宏給你。

int wmain(int argc, wchar_t* argv[])

而且我覺得我們應(yīng)該用wmain功能代替main..它們都可以工作,但是在unicode環(huán)境中。wmain可能更方便。

另外,我的源文件是UTF-16-le編碼的,這似乎是默認的在VisualStudio 2017。

2.控制臺代碼頁

這很明顯。我們需要控制臺中的Unicode代碼頁。如果要檢查默認代碼頁,只需打開控制臺并鍵入chcp任何爭論。我們必須將它更改為65001,這是UTF-8代碼頁。Windows代碼頁標識符該代碼頁有一個預(yù)處理宏:CP_UTF8..我需要同時設(shè)置輸入和輸出代碼頁。當(dāng)我忽略其中任何一個時,輸出都是不正確的。

SetConsoleOutputCP(CP_UTF8);SetConsoleCP(CP_UTF8);

還可以檢查這些函數(shù)的布爾值返回值。

3.選擇字體

直到現(xiàn)在,我還沒有找到支持每個字符的控制臺字體。所以我不得不選擇一個。如果您想要輸出只在一種字體中部分可用,部分在另一種字體中可用的字符,那么我認為不可能找到解決方案。只有當(dāng)有一種字體支持每一個字符時,才有可能。但我也沒有研究如何安裝字體。

我認為不可能同時在同一個控制臺窗口中使用兩種不同的字體。

如何找到兼容的字體?打開控制臺,單擊窗口左上方的圖標,轉(zhuǎn)到控制臺窗口的屬性。轉(zhuǎn)到“字體”選項卡,選擇一種字體,然后單擊“確定”。然后嘗試在控制臺窗口中輸入您的字符。重復(fù)此操作,直到找到可以使用的字體。然后記下字體的名稱。

此外,還可以在“屬性”窗口中更改字體的大小。如果您找到滿意的大小,請記下“選定字體”部分“屬性”窗口中顯示的大小值。它將顯示寬度和高度(以像素為單位)。

若要以編程方式實際設(shè)置字體,請使用:

CONSOLE_FONT_INFOEX fontInfo;// ... configure fontInfoSetCurrentConsoleFontEx(hConsole, false, &fontInfo);

有關(guān)詳細信息,請參閱本答案末尾的示例?;蛘咴诰毜氖謨岳锊橐徊椋?/trans>SetCurrentConsoleFont..此功能只存在于WindowsVista之后。

4.設(shè)置地區(qū)

您需要將區(qū)域設(shè)置為要打印的字符的語言區(qū)域設(shè)置。

char* a = setlocale(LC_ALL, "chinese");

返回值很有趣。它將包含一個字符串,用于準確描述所選的區(qū)域設(shè)置。試試看:-)我用chinesegerman..更多信息:賽特

5.使用寬字符輸出

這里沒什么好說的。如果要輸出寬字符,請使用以下示例:

std::wcout << L"你好" << std::endl;

哦,別忘了L寬字符的前綴!如果在源文件中鍵入這樣的文本Unicode字符,則必須對源文件進行Unicode編碼。與VisualStudio中的默認設(shè)置一樣,UTF-16-le也是。或者用記事本+并將編碼設(shè)置為UCS-2 LE BOM.

最后,我把所有這些放在一起作為一個例子:

#include <Windows.h>#include <iostream>#include <io.h>#include <fcntl.h>#include <locale.h>#include <wincon.h>int wmain
(int argc, wchar_t* argv[]){
    SetConsoleTitle(L"My Console Window - 你好");
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    char* a = setlocale(LC_ALL, "chinese");
    SetConsoleOutputCP(CP_UTF8);
    SetConsoleCP(CP_UTF8);

    CONSOLE_FONT_INFOEX fontInfo;
    fontInfo.cbSize = sizeof(fontInfo);
    fontInfo.FontFamily = 54;
    fontInfo.FontWeight = 400;
    fontInfo.nFont = 0;
    const wchar_t myFont[] = L"KaiTi";
    fontInfo.dwFontSize = { 18, 41 };
    std::copy(myFont, myFont + (sizeof(myFont) / sizeof(wchar_t)), fontInfo.FaceName);

    SetCurrentConsoleFontEx(hConsole, false, &fontInfo);

    std::wcout << L"Hello World!" << std::endl;
    std::wcout << L"你好!" << std::endl;
    return 0;}

干杯!


查看完整回答
反對 回復(fù) 2019-06-10
?
慕虎7371278

TA貢獻1802條經(jīng)驗 獲得超4個贊

wcout必須設(shè)置與CRT不同的區(qū)域設(shè)置。下面是如何解決這個問題的方法:

int _tmain(int argc, _TCHAR* argv[]){
    char* locale = setlocale(LC_ALL, "English"); // Get the CRT's current locale.
    std::locale lollocale(locale);
    setlocale(LC_ALL, locale); // Restore the CRT.
    std::wcout.imbue(lollocale); // Now set the std::wcout to have the locale that we got from the CRT.
    std::wcout << L"?Hola!";
    std::cin.get();
    return 0;}

我剛剛測試了它,它顯示這里的字符串非常好。


查看完整回答
反對 回復(fù) 2019-06-10
  • 3 回答
  • 0 關(guān)注
  • 1534 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號