什么是阿拉伯联合酋长国正确的Windows setlocale?

时间:2013-08-29 20:50:29

标签: windows internationalization locale

来自阿拉伯联合酋长国的亲爱的阿拉伯读者,

我正准备将我的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

1 个答案:

答案 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弄乱。

<强>附加功能:

  1. 您可以使用wmain而不是main:

    int wmain(int argc, WCHAR **argv)
    

    这样你可以调用_wsetlocale(LC_TIME,argv [1]),不需要MultiByteToWideChar。

  2. 您应该在使用中将参数传递给printf:

    printf("Usage: %s <CRT localename>", str);
    

    printf("Usage: %s <CRT localename>");
    
  3. 您也可以使用wprintf,并且一直是Unicode。

  4. 您可能需要查看“使用通用文本映射” http://msdn.microsoft.com/en-us/library/7dzey6h6.aspx

    使用像_tprintf而不是printf / wprintf这样的东西可能会让你有机会在Windows / Linux之间重用代码(尽管POSIX国际支持很差)

  5. 您可能想在本文+工具中获取战利品:http://mihai-nita.net/2007/12/19/tounicode-automating-some-of-the-steps-of-unicode-code-conversion-windows/

    它可能有助于您迁移代码以使用Generic-Text函数。 (这样你就可以定义UNICODE和_UNICODE并获得一个完全的Unicode应用程序)

  6. 不要指望来自Windows控制台的奇迹。众所周知,渲染外来字符串很差。您必须设置系统区域设置才能获得不错的结果。