【问题标题】:GNU gettext msgfilter program says "invalid multibyte sequence"GNU gettext msgfilter 程序说“无效的多字节序列”
【发布时间】:2018-06-06 18:19:01
【问题描述】:

GNU gettext 程序 msgfilter 似乎不接受 UTF8 字符串作为作为过滤器给出的脚本的结果。该脚本仅返回从文件中读取的准备好的文本。

这是测试设置:

echo '#!/bin/bash
cat /tmp/t3.txt
' > /tmp/trans01.sh
chmod a+rwx /tmp/trans01.sh

然后有一个文件/tmp/t3.txt:

cat /tmp/t3.txt

结果:

AMSTERDAM REISEFÜHRER FÜR REISE, UNTERKUNFT, SEHENSWÜRDIGKEITEN     

是utf-8文件:

file /tmp/t3.txt

给予:

/tmp/t3.txt: UTF-8 Unicode text

进一步:

echo 'msgid "kk71ams_amsterdam_main_page_title"
msgstr "AMSTERDAM TOURIST GUIDE FOR TRAVEL, ACCOMMODATION, ATTRACTIONS"
' > /tmp/te1.po

比:

cat /tmp/te1.po

给予:

msgid "kk71ams_amsterdam_main_page_title"
msgstr "AMSTERDAM TOURIST GUIDE FOR TRAVEL, ACCOMMODATION, ATTRACTIONS"

比:

file /tmp/te1.po

给予:

/tmp/te1.po: GNU gettext message catalogue, ASCII text

语言环境:

:~# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

现在'msgfilter'的问题:

~# msgfilter -i /tmp/te1.po '/tmp/trans01.sh'
msgid "kk71ams_amsterdam_main_page_title"
/tmp/te1.po:2: invalid multibyte sequence
/tmp/te1.po:2: invalid multibyte sequence
/tmp/te1.po:2: invalid multibyte sequence
/tmp/te1.po:2: invalid multibyte sequence
/tmp/te1.po:2: invalid multibyte sequence
/tmp/te1.po:2: invalid multibyte sequence
/tmp/te1.po:2: invalid multibyte sequence
/tmp/te1.po:2: invalid multibyte sequence
/tmp/te1.po:2: invalid multibyte sequence
/tmp/te1.po:2: invalid multibyte sequence
/tmp/te1.po:2: invalid multibyte sequence
/tmp/te1.po:2: invalid multibyte sequence
msgstr "AMSTERDAM REISEFHRER FR REISE, UNTERKUNFT, SEHENSWRDIGKEITEN\n"

【问题讨论】:

    标签: locale gettext


    【解决方案1】:

    不完全相同的情况,但我遇到了同样的问题,我通过添加正确的 Content-type 解决了它。

    我有:

    "Content-Type: text/plain; charset=ASCII\n"
    

    这似乎是默认设置。

    并改成:

    "Content-Type: text/plain; charset=UTF-8\n"
    

    即使我的文件也是 UTF-8,我也必须明确更改 Content-Type 中的字符集

    【讨论】:

    • 我面临同样的问题(尽管我更喜欢为此尝试破解一个工作的makefile),我对你的回答有点困惑。我只知道这样的字符串是关于由网络服务器提供的文件的情况,你能否解释一下你在哪里更改了该行以使 gettext 与 äöü 等一起工作?
    • 没关系,我找到了。我的错误是我不知道我应该简单地复制.pot 文件而不是使用某些命令并尝试使用touch de.po 然后使用msgmerge,因此缺少标题。 (只是复制才是正确的方式,对吧……?)
    【解决方案2】:

    我遇到了同样的问题,我刚刚解决了。

    您可能在 msgfilter 命令中忘记了 --keep-header

    此标志将源文件的标头保留在输出文件中,如果不这样做,则输出 po 文件显然被视为 ASCII 文件。

    现在我这样做: msgfilter --keep-header -i mvap.po -o en_US.po ./script_merge_translate.sh

    它可以工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多