如何解决gettext字符编码
| 我有以下gettext .po文件,该文件是从.pot文件转换而来的。我正在Linux系统(如果需要的话,请使用openSUSE)上运行gettext 0.17。#
# <translate@transme.de>,2011
# transer <translate@transme.de>,2011
msgid \"\"
msgstr \"\"
\"Project-Id-Version: transtest\\n\"
\"Report-Msgid-Bugs-To: \\n\"
\"POT-Creation-Date: 2011-05-24 22:47+0100\\n\"
\"PO-Revision-Date: 2011-05-30 23:03+0100\\n\"
\"Last-Translator: \\n\"
\"Language-Team: German (Germany)\\n\"
\"MIME-Version: 1.0\\n\"
\"Content-Type: text/plain; charset=UTF-8\\n\"
\"Content-Transfer-Encoding: 8bit\\n\"
\"Language: de_DE\\n\"
\"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 \”命令检查编码,
file --mime transtest_de_DE.po
transtest_de_DE.po: text/x-po; charset=utf-8
然后将其安装到我的语言环境文件夹,并在导出LANG
和LC_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_CTYPE
和LANG
导出为\“ de_DE \”。
$ echo $LC_CTYPE; echo $LANG
de_DE
de_DE
我要去哪里错了?为什么gettext为我的字符串而不是请求的(在.po文件中)UTF-8给我错误的编码(ISO-8859-2)?
编辑:
解决方案是在StackOverflow问题中,无法使(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,\"/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
是错误的。如果您想在内部使用固定编码方式(例如GNOME可以,但是输出应该始终在语言环境指定的位置(通过调用nl_langinfo(CODESET)
获得,这也是gettext在默认情况下所做的操作)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。