对于一个小项目,我需要在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语言环境是无关紧要的。但是,您可以更改此代码页。 –