0

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

我正在将我的 Linux 代码移植到纯 Windows 上。除其他外,此代码假装将公历日期(内部为 Unix 日期)转换为回历日期,并使用阿拉伯联合酋长国语言环境显示结果。

我需要您的真正原因是在 Windows 及其 C 运行时正确设置您所在国家/地区的语言环境。到目前为止,我已经测试了许多“Arabic_United Arab Emirates.1256”字符串的组合,微软清楚地记录了这些组合。我所有的尝试都返回 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);    
}

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

C:\path>foo ""

并用您阅读的内容回复此帖子。

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

我确实害怕把自己的笔记本变成阿拉伯语(阿拉伯联合酋长国)。我是一个纯粹的法国公民,试图通过他的公共网站最大程度地满足全球 IT 社区的需求。我绝对没有被介绍过任何阿拉伯语,甚至是阿拉伯语的地方方言。我真的担心如果我将我的区域设置转换为您的国家/地区设置,我将不得不肯定地与 Windows 说再见。我的 Windows Notebook 已预装 Windows。所以没有CD来重新安装Windows。

对于这篇文章的任何回复,非常感谢您。如果您带来预期的答案,如果可能的话,解决方案会更多。

菲利普·沃特斯

4

1 回答 1

1

简短的回答:

阿拉伯语_U.AE.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 /

    它可能会帮助您迁移代码以使用通用文本函数。(这样您就可以定义 UNICODE 和 _UNICODE 并获得完整的 Unicode 应用程序)

  6. 不要指望 Windows 控制台会带来奇迹。它在渲染外来字符串方面是出了名的差。您必须设置系统区域设置才能获得不错的结果。

于 2013-09-13T03:29:07.920 回答