You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含国际化字符的账户名导致gettext无法工作的问题求助

gettext无法加载含国际化字符账户下的翻译文件问题求助

我在应用中通过已安装的locale文件夹获取翻译消息,但当Windows账户名包含国际化字符(比如Gergő里的ő)时,gettext库无法加载并转换文本字符串。当前使用的是msys2中的UCRT64环境,具体复现步骤如下:

  1. 创建名为test Gergő的Windows用户账户,完成msys2配置;
  2. 在该账户下执行以下命令:
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 
  1. 编写测试代码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;
}
  1. 编译命令:
cc -o tt tt.c -static -lintl -liconv
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:17:28