首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gettext字符编码

gettext字符编码
EN

Stack Overflow用户
提问于 2011-05-30 22:35:56
回答 1查看 3.9K关注 0票数 8

我有下面的gettext .po文件,它已经从.pot文件中翻译出来了。我正在运行一个Linux系统(如果重要的话是openSUSE),运行gettext 0.17。

代码语言:javascript
复制
# 
#   <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文件时

代码语言:javascript
复制
msgfmt -c transtest_de_DE.po -o transtest.mo

然后用"file“命令检查编码,

代码语言:javascript
复制
file --mime transtest_de_DE.po
transtest_de_DE.po: text/x-po; charset=utf-8

然后将其安装到我的locale文件夹中,并在导出LANGLC_CTYPE之后运行该程序,最后在两个非ASCII字符所在的垃圾中结束。

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

通过文本编辑器查看生成的.mo文件,该文件似乎也在UTF-8中(如果我将编辑器编码设置为UTF-8,我可以看到符号)。

程序非常简单,看起来是这样的:

代码语言:javascript
复制
#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“。

代码语言:javascript
复制
$ echo $LC_CTYPE; echo $LANG
de_DE
de_DE

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

编辑:

解决方案在堆栈溢出问题https://stackoverflow.com/questions/2264740/cant-make-utf-8-traditional-chinese-character-to-work-in-php-gettext-extension中,看来我需要显式调用

代码语言:javascript
复制
bind_textdomain_codeset(PROGRAM_NAME, "utf-8");

最终程序看起来是这样的:

代码语言:javascript
复制
#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文件进行任何更改。

EN

回答 1

Stack Overflow用户

发布于 2011-05-31 13:41:24

如果你有LC_CTYPE=de_DE (或LANG),程序应该输出ISO-8859-1 (注1,而不是2),所以如果你有它,并且你的终端被设置为utf-8,它就是错误的。utf-8的正确地区是de_DE.utf-8

在您的情况下,使用bind_textdomain_codeset是错误的。如果您想在内部使用固定编码(例如GNOME ),则可以使用bind_textdomain_codeset,但是输出应该始终在区域设置指定的范围内(通过调用nl_langinfo(CODESET)获得,这也是gettext默认做的事情)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6181294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档