【问题标题】:How can I get the encoding from a GNU gettext .mo file in C++如何从 C++ 中的 GNU gettext .mo 文件中获取编码
【发布时间】:2021-06-23 12:09:32
【问题描述】:

我正在使用 GNU gettext 进行翻译,它可以工作。 下面的测试代码展示了我的实现思路:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

#include <libintl.h>
#include <locale.h>

#define _(STRING) gettext(STRING)

int main()
{
  /* Setting the i18n environment */
  setlocale (LC_ALL, "");
  bindtextdomain ("hello", getenv("PWD"));
  textdomain ("hello");

  /* Example of i18n usage */
  std::cout << _("Hello World!") << std::endl;

  setenv("LANGUAGE", "fr", 1);

  std::cout << _("Hello World!") << std::endl;

  return EXIT_SUCCESS;
}

我有一个工作的 .mo 文件,所以当我运行程序时,我得到:

Hello World!
Bonjour le monde!

到目前为止一切顺利。 但我必须将翻译后的字符串转发给第 3 方应用程序,并且我需要指明编码(拉丁语 1、拉丁语 9、西里尔语、UTF-8 等)。

如何在运行时获取编码?

【问题讨论】:

  • C++ 语言环境对象不提供确定语言环境编码的方法。这只能通过使用 C 库/POSIX 函数来实现。
  • 看看that answer 基本上标准库旨在设置全局字符串编码(适用于应用程序和所有库)。并且流编码是单独定义的——如果需要,转换是静默完成的。你怎么forward the translated strings to a 3rd party application
  • @MarekR 字符串在对象中转发。一个字符串对象,它保存字符串的字节表示(char 数组)。字符串对象引用保存编码的字体对象。一些较旧的控制台仅支持拉丁语 1 和拉丁语 9,另一些则支持更多的字符集,最新的将支持 UTF-16。所以我需要弄清楚如何将 gettext() 输出转换为支持的字符集,如果我知道翻译器使用的字符集,那会更容易。
  • 您使用什么将数据从一个应用程序发送到另一个应用程序?这是某种std:ostream吗?
  • @MarekR。不会。它通过 CAN(控制器局域网)发送到另一台设备。有一个已定义的协议,我无法更改,因此我需要能够找到编码。或者,我可以确保所有翻译都使用 UTF-8 完成,然后在选择新语言时分析文本字符串。这将需要一种方法来遍历 .mo 文件中的所有文本字符串,但我也找不到这样做的方法。

标签: c++ gettext


【解决方案1】:

试图找出用于翻译字符串的编码是一些猜测工作。但是您可以通过调用bind_textdomain_codeset(DOMAINNAME, CODESET) 来强制执行某种编码,请参阅https://man7.org/linux/man-pages/man3/bind_textdomain_codeset.3.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2012-06-07
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多