来自阿拉伯联合酋长国的亲爱的阿拉伯读者,
我正准备将我的Linux代码移植到纯Windows上。除其他外,此代码假装将公历日期(在Unix日期内)转换为Hijri日期,并使用阿拉伯联合酋长国区域设置显示结果。
我需要你的真正原因是在Windows及其C运行时下正确设置国家/地区的语言环境。到目前为止,我已经测试了“阿拉伯联合酋长国.1256”字符串的许多组合,这些字符串由Microsoft明确记录。我的所有尝试都返回null。我面临的问题似乎对阿拉伯联合酋长国非常具体,因为我可以毫无疑问地设定:Arabic_Saudi Arabia.1256或Arabic_Egypt.1256。
因此,如果有一些开发人员在他的Windows PC上安装了Microsoft Visual Studio套件,那么他是否愿意在CMD终端下使用以下命令构建并运行以下纯Windows C代码?
/*
* File : foo.c
*
* To build :
* C:\path>vcvars64
* C:\path>cl /c /Tp foo.c
* C:\path>link /subsystem:console foo.obj kernel32.lib
*
* Goal:
* find the Windows C locale suited for the United Arab Emirates
*
* OS: Microsoft Windows 7 Entreprise N
*/
#include <windows.h>
#include <stdio.h>
#include <locale.h>
void usage(char *str)
{
printf("Usage: %s <CRT localename>");
exit(EXIT_FAILURE);
}
int main(int argc, char **argv)
{
wchar_t localename[100];
if (argc != 2) usage(argv[0]);
MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, localename, sizeof(localename));
wprintf(L"%s\n",_wsetlocale(LC_TIME,localename));
exit(EXIT_SUCCESS);
}
如果您的区域和语言Windows设置(控制面板)设置为阿拉伯语(阿拉伯联合酋长国),那么您应该运行以下代码:
C:\path>foo ""
并根据您的内容回复此帖。
在我的Windows 7和我的Windows区域设置上,上面的代码和提供的CMD命令今晚显示:“French_France.1252”
我确实害怕把自己的笔记本变成阿拉伯语(阿拉伯联合酋长国)。我是一个纯粹的法国公民,试图通过他的公共网站最好地满足全球IT社区。我绝对不会介绍任何阿拉伯语,甚至更多的阿拉伯语区域方言。如果我将区域设置转换为您的国家/地区设置,我真的担心我必须与Windows明确告别。我的Windows笔记本电脑已经预装了Windows。所以没有CD可以重新安装Windows。
对于这篇文章的任何回复者,非常感谢你。如果你带来预期的答案,如果可能的话,还有更多的解决方案。
Philippe Vouters
答案 0 :(得分:1)
简答:
Arabic_U.A.E..1256
答案很长:
BOOL CALLBACK EnumLocalesProcEx(LPWSTR lpLocaleId, DWORD dwFlags, LPARAM lParam) {
WCHAR name[10];
if (GetLocaleInfoEx(lpLocaleId, LOCALE_SABBREVLANGNAME, name, _countof(name))) {
WCHAR *crtLocale = _wsetlocale(LC_TIME, name);
wprintf(L"%s %s %s\n", lpLocaleId, name, crtLocale);
}
return TRUE;
}
...
EnumSystemLocalesEx(EnumLocalesProcEx, LOCALE_ALL, 0, NULL);
这将为您提供所支持的所有语言环境的完整列表。 (当然,保存/恢复原始语言环境会很不错,因为它会被_wsetlocale弄乱。
<强>附加功能:强>
您可以使用wmain而不是main:
int wmain(int argc, WCHAR **argv)
这样你可以调用_wsetlocale(LC_TIME,argv [1]),不需要MultiByteToWideChar。
您应该在使用中将参数传递给printf:
printf("Usage: %s <CRT localename>", str);
不
printf("Usage: %s <CRT localename>");
您也可以使用wprintf,并且一直是Unicode。
您可能需要查看“使用通用文本映射” http://msdn.microsoft.com/en-us/library/7dzey6h6.aspx
使用像_tprintf而不是printf / wprintf这样的东西可能会让你有机会在Windows / Linux之间重用代码(尽管POSIX国际支持很差)
您可能想在本文+工具中获取战利品:http://mihai-nita.net/2007/12/19/tounicode-automating-some-of-the-steps-of-unicode-code-conversion-windows/
它可能有助于您迁移代码以使用Generic-Text函数。 (这样你就可以定义UNICODE和_UNICODE并获得一个完全的Unicode应用程序)
不要指望来自Windows控制台的奇迹。众所周知,渲染外来字符串很差。您必须设置系统区域设置才能获得不错的结果。