短篇小说:
我在Locale :: Maketext中遇到了一个奇怪的问题。使用时,某些东西会将德语变音符号转换为ISO-8859-1编码
"使用utf8"我的词典中的pragma。
长篇故事:
在我的Web应用程序中,所有内容都保存在UTF-8中:
我对L10N使用 Locale :: Maketext ,并且所有mit词典都在Perl模块中定义,这些模块以UTF-8保存, "使用utf8"。到目前为止测试的所有语言(例如pt,pl,fr,en,zh,ko等等)都可以正常工作,除了locale de。 只要" 使用utf8 "在这种语言的启用下,Lexicon会变成德语变音符号(可能是所有的东西 没有7位ASCII)到ISO-8859-1。我有一个脚本可以验证我的源代码树中的所有内容都是用UTF-8编码的(当然还包括7位ASCII)。
让我再说一遍:如果我在我的应用中使用了maketext后删除"使用utf8" pragma for Module MyApp :: L10N :: de得到的编码是UTF-8 ,这很好。只要模块使用 utf8 ,编码就会变成ISO-8859-1 ,而所有其他语言都可以使用。我不顾一切地想知道原因,因为这与我读过的关于utf8编译的内容并不相符。
我的问题很简单:为什么会发生这种情况?我如何修复这种行为,即如何在所有内容中使用utf8 源文件?
答案 0 :(得分:1)
您遇到的失败记录在Locale::Maketext::Gettext:
中这个Locale :: Maketext :: Gettext对原始Locale :: Maketext(3)的一个重要好处是:GNU gettext是多字节安全的,但Perl源不是。 [...]很抱歉这样说,但本地化框架不是多字节安全的,这很奇怪。
建议您将Maketext迁移到基于Gettext的解决方案,请参阅rassie非凡的语音咆哮:http://rassie.org/archives/247
答案 1 :(得分:0)
我发现自己是一个解决方案:将所有输入和输出设置为utf8确实有效。 Perl做了一些愚蠢的转换。
我刚才把它放在我脚本的最开头:
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";