gettext字符编码

我有以下gettext .po文件,该文件已从.pot文件转换而来。 我正在使用Linux系统(openSUSE,如果它很重要),运行gettext 0.17。

# 
#   <translate@transme.de>, 2011
# transer <translate@transme.de>, 2011
msgid ""
msgstr ""
"Project-Id-Version: transtestn"
"Report-Msgid-Bugs-To: n"
"POT-Creation-Date: 2011-05-24 22:47+0100n"
"PO-Revision-Date: 2011-05-30 23:03+0100n"
"Last-Translator: n"
"Language-Team: German (Germany)n"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=UTF-8n"
"Content-Transfer-Encoding: 8bitn"
"Language: de_DEn"
"Plural-Forms: nplurals=2; plural=(n != 1)n"

#: transtest.cpp:12
msgid "Min Size"
msgstr "Min Größe"

现在,当我通过创建.mo文件

msgfmt -c transtest_de_DE.po -o transtest.mo

然后我用“文件”命令检查编码,

file --mime transtest_de_DE.po
transtest_de_DE.po: text/x-po; charset=utf-8

然后将其安装到我的区域设置文件夹并在导出LANGLC_CTYPE后运行该程序,最后得到两个非ASCII字符所在的垃圾。

如果我将终端编码设置为ISO-8859-2而不是UTF-8,那么我会正确看到这两个字符。

用文本编辑器查看生成的.mo文件,该文件也显示为UTF-8(如果将编辑器编码设置为UTF-8,我可以看到这些符号)。

该程序非常简单,它看起来像这样:

#include <iostream>
#include <locale>
const char *PROGRAM_NAME="transtest";

using namespace std;

int main()
{
    setlocale (LC_ALL, "");
    bindtextdomain( PROGRAM_NAME, "/usr/share/locale" );
    textdomain( PROGRAM_NAME );
    cerr << gettext("Min Size") << endl;
}

我将.mo文件安装到/usr/share/locale/de_DE/LC_MESSAGES/transstest.mo ,并将LC_CTYPELANG导出为“de_DE”。

$ echo $LC_CTYPE; echo $LANG
de_DE
de_DE

我哪里错了? 为什么gettext为我的字符串提供了错误的编码(ISO-8859-2),而不是请求的(在.po文件中)UTF-8?

编辑:

解决方案在Stack Overflow问题中无法使(UTF-8)传统中文字符在PHP gettext扩展中工作(在poEdit中创建.po和.mo文件),并且似乎需要显式调用

bind_textdomain_codeset(PROGRAM_NAME, "utf-8");

最终的程序如下所示:

#include <iostream>
#include <locale>
const char *PROGRAM_NAME="transtest";

using namespace std;

int main()
{
    setlocale (LC_ALL, "");
    bindtextdomain( PROGRAM_NAME, "/usr/share/locale" );
    bind_textdomain_codeset(PROGRAM_NAME, "utf-8");
    textdomain( PROGRAM_NAME );
    cerr << gettext("Min Size") << endl;
}

我的任何gettext文件都不需要更改。


如果你有LC_CTYPE=de_DE (或LANG ),程序应该输出ISO-8859-1(注意,1,不是2),所以如果你有这个,你的终端设置为utf-8,那就错了。 utf-8的正确语言环境是de_DE.utf-8

在你的情况下使用bind_textdomain_codeset是错误的。 如果你想在内部使用固定编码工作,使用bind_textdomain_codeset ,就像例如GNOME一样,但是输出应该总是在语言环境指定的地方(通过调用nl_langinfo(CODESET) ,这也是默认的gettext)。

链接地址: http://www.djcxy.com/p/52897.html

上一篇: gettext character encoding

下一篇: Setting Custom HTTP Header for GWT Forms