含国际化字符的账户名导致gettext无法工作的问题求助
gettext无法加载含国际化字符账户下的翻译文件问题求助
我在应用中通过已安装的locale文件夹获取翻译消息,但当Windows账户名包含国际化字符(比如Gergő里的ő)时,gettext库无法加载并转换文本字符串。当前使用的是msys2中的UCRT64环境,具体复现步骤如下:
- 创建名为
test Gergő的Windows用户账户,完成msys2配置; - 在该账户下执行以下命令:
cd "/c/Users/test Gergő" mkdir -p locale/nl/LC_MESSAGES cp /usr/share/locale/nl/LC_MESSAGES/sed.mo locale/nl/LC_MESSAGES/ cd
- 编写测试代码
tt.c:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> #include <libintl.h> #include <wchar.h> #include <windows.h> #define DOM "sed" int main (int argc, char *argv []) { wchar_t *wtmp; char buff [512]; char tbuff [512]; char *tmp; size_t len; wtmp = _wgetenv (L"USERPROFILE"); // wtmp = _wgetenv (L"HOME"); len = WideCharToMultiByte (CP_UTF8, 0, wtmp, -1, NULL, 0, NULL, NULL); WideCharToMultiByte (CP_UTF8, 0, wtmp, -1, buff, len + 1, NULL, NULL); wtmp [len] = L'\0'; sprintf (tbuff, "%s/locale", buff); // or vice-versa. fails both ways. // just to be sure the path is consistent. for (int i = 0; i < strlen (tbuff); ++i) { if (tbuff [i] == '\\') { tbuff [i] = '/'; } } tmp = bindtextdomain (DOM, tbuff); fprintf (stderr, "bind: %s\n", tmp); tmp = textdomain (DOM); fprintf (stderr, "text-dom: %s\n", tmp); if (setlocale (LC_MESSAGES, tbuff) == NULL) { fprintf (stderr, "set-locale failed\n"); } _wputenv_s (L"LC_MESSAGES", L"nl.UTF-8"); tmp = gettext ("No match"); if (strcmp (tmp, "No match") == 0) { fprintf (stderr, "NG %s\n", tmp); } else { fprintf (stderr, "OK %s\n", tmp); } return 0; }
- 编译命令:
cc -o tt tt.c -static -lintl -liconv
- 在cmd.exe窗口运行程序:
C:\msys64\home\test Gergő\tt.exe
运行结果
程序无法找到sed.mo中的"No match"字符串,输出如下:
bind: C:\Users\test Gergő\locale text-dom: sed NG No match
补充说明
使用bll、test user这类不含特殊国际化字符的账户名时,程序可正常工作;无论读取USERPROFILE还是HOME环境变量,或是在msys2终端内运行,问题只出现在账户名含国际化字符的场景。
有没有人遇到过这个问题?求解决方案。
内容的提问来源于stack exchange,提问作者Brad Lanam
相关产品推荐
相关产品推荐

