阿拉伯联合酋长国的正确Windows设置区域设置是什么



尊敬的阿拉伯联合酋长国读者,

我正在将我的Linux代码移植到纯Windows的路上。除其他代码外,该代码假装将格里高利日期(内部为Unix日期)转换为Hijri日期,并使用阿拉伯联合酋长国区域设置显示结果。

我需要你的真正原因是在Windows及其C运行时下正确设置你所在国家的语言环境。到目前为止,我已经测试了"Arabic_United Arab Emirates.1256"字符串的许多组合,正如微软明确记录的那样。我所有的尝试都失败了。我所面临的问题似乎是阿拉伯联合酋长国特有的,因为我可以毫无问题地解决:阿拉伯_沙特阿拉伯.1256或阿拉伯_埃及.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"%sn",_wsetlocale(LC_TIME,localename));
   exit(EXIT_SUCCESS);    
}

如果您的区域和语言窗口设置(控制面板)设置为阿拉伯语(阿拉伯联合酋长国),那么您应该使用运行代码

C:path>foo ""

并用你读到的内容回复这篇文章。

在我的Windows 7和Windows区域设置中,上面的代码和今晚提供的CMD命令显示我:"French_France.1252"

我确实害怕把我的笔记本变成阿拉伯语(阿拉伯联合酋长国)。我是一个纯粹的法国公民,努力通过他的公共网站来满足全球IT社区的需求。我绝对没有接触过任何阿拉伯语,更没有接触过阿拉伯语地区方言。我真的很担心,如果我把我的地区设置改为你的国家/地区设置,我肯定要告别Windows。我的Windows笔记本已预装Windows。所以没有CD来重新安装Windows。

对于任何回复这篇文章的人,非常感谢你。如果你提出了预期的答案,如果可能的话,还有解决方案。

Philippe Vouters

简短回答:

阿拉伯联合酋长国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    %sn", 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控制台会带来奇迹。它在渲染外国字符串方面是出了名的糟糕。您必须设置系统区域设置才能获得良好的结果。

最新更新