對於一個小項目,我需要在Windows的CMD中輸出可能已本地化的文本字符串,並且從程序的參數中讀取一些字符串。爲了簡化問題,我將使用一個簡單的回聲程序作爲演示。如何在命令行的語言環境中顯示文本?
請考慮在C語言片段:
#include <stdio.h>
int main(int argc, char **argv) {
// Display the first argument through the standard output:
if (argc > 1)
puts(argv[1]);
return 0;
}
這是兩個執行的輸出:
$ test.exe Wilhelm
$ Wilhelm
$ test.exe Röntgen
$ R÷ntgen
在那裏,你已經可以看到的東西像ö
這將是從ASCII的不會正確顯示。但是,他們在節目中正確識別,例如,如果你這樣做:
if (argv[1][1] == 'ö')
puts("It is.");
的句子會被顯示出來,所以程序正確接收的字符。
所以我雖然,OK,那可能需要wchar_t
的事情,所以做適當的修改和定義UNICODE
和_UNICODE
你會得到:
#include <stdio.h>
int wmain(int argc, wchar_t **argv) {
// Display the first argument through the standard output:
if (argc > 1)
_putws(argv[1]);
return 0;
}
不過這個測試程序的輸出將是相同的。
環顧四周,閱讀文檔,我發現有些解決方法,例如將語言環境設置爲英語:文本將正確顯示。修改的第一個版本(無wchar_t
S)我結束了與此:
#include <stdio.h>
#include <locale.h>
int main(int argc, char **argv) {
// Get the previous locale and change to English:
char *old_locale = setlocale(LC_ALL, NULL);
setlocale(LC_ALL, "English");
// Display the first argument through the standard output:
if (argc > 1)
puts(argv[1]);
// Restore locale:
setlocale(LC_ALL, old_locale);
return 0;
}
("en-US"
似乎並不在MinGW的-W64工作,而"English"
作品與它和Microsoft Visual C++)
現在程序可以打印,以便在命令行窗口中正確顯示字符。
問題在於,將事情設置爲英語並不是西班牙語系統或日語系統中最好的事情。所以我想以某種方式從系統中獲取語言環境。我發現了一個叫_get_current_locale
函數返回一個_locale_t
,但它似乎不是我想要的東西都:
_locale_t_variable->locinfo->lc_category[LC_ALL].locale
(這是一個char *
)似乎是NULL
。
所以問題是,如何獲取或顯示命令行的語言環境中的文本?在Windows'CMD中處理本地化文本的正確方法是什麼(不一定是Unicode)?
你的問題有可取之處。 'echo'程序可以在我的Win7機器上正確回顯'Röntgen';所以你試圖做的顯然是可能的。 –
但是,再次,'echo'是MS cmd shell的內部。它可以通過外殼進行'特殊'處理... –
默認情況下,命令提示符使用OEM代碼頁。設置C語言環境是無關緊要的。但是,您可以更改此代碼頁。 –