2010-12-14 9 views
1

Die Kurzgeschichte:
Ich habe ein seltsames Problem mit Locale :: Maketext gefunden. Etwas verwandelt deutsche Umlaute in ISO-8859-1-Codierung, wenn das Pragma "UTF8 verwenden" in meinem Lexikon verwendet.Perl UTF-8 Probleme mit Locale :: Maketext

Die lange Geschichte:
In meiner Web-Anwendung ist alles in UTF-8 gehalten:

  • die Datenbank
  • der Quellcode-Dateien
  • die HTML-Doctype
  • und alles sonst so weit kann ich sagen

Ich benutze Locale :: Maketext für L10N und alle mit Lexicons sind in Perl-Module definiert, die in UTF-8 und "utf8" gehalten werden. Alle bisher getesteten Sprachen (z.B. pt, pl, fr, en, zh, ko, et al.) Funktionieren gut außer dem locale de. Solange ein "utf8" im Lexikon dieser Sprache aktiviert ist, werden die deutschen Umlaute (wahrscheinlich alles, was kein 7-Bit ASCII ist) in ISO-8859-1 umgewandelt. Ich habe das Skript, das überprüft, dass alles in meinem Quellbaum in UTF-8 codiert ist (natürlich auch 7-Bit-ASCII).

Lassen Sie mich wiederholen: Wenn ich die „Verwendung utf8“ Pragma für das MeineAnw Modul entfernen :: L10N :: de die resultierende Codierung nach Maketext in meine app ist UTF-8 was in Ordnung ist. Solange das Modul utf8 verwendet, wird die Codierung in ISO-8859-1 umgewandelt, während alle anderen Sprachen funktionieren. Ich bin verzweifelt, um herauszufinden, warum, denn das entspricht nicht ganz dem, was ich über das utf8-Pragma gelesen habe.

Meine Frage ist einfach: Warum passiert das? Wie kann ich beheben dieses Verhalten, d. H. Wie mache ich meine App mit utf8 in alle Quelldateien arbeiten?

Antwort

0

ich mir eine Lösung gefunden habe: did alle Ein- und Ausgaben auf UTF-8 Einstellarbeiten . Perl hat einige blöde Conversions gemacht.

binmode STDIN, ":utf8"; 
binmode STDOUT, ":utf8"; 
binmode STDERR, ":utf8"; 
1

Das Scheitern Sie erleben in Locale::Maketext::Gettext dokumentiert ist:

Ein wesentlicher Vorteil dieser Locale :: Maketext :: Gettext über die ursprüngliche Locale :: Maketext (3) ist, dass: GNU gettext ist multibyte sicher , aber Perl-Quelle ist nicht. [...] Tut mir leid, das zu sagen, aber es ist seltsam, dass ein Lokalisierungsframework nicht multibyte-sicher ist.

Es wird empfohlen, Maketext auf eine Gettext-basierte Lösung zur Migration aus, siehe rassie ‚s bemerkenswerte rocalisation rant: http://rassie.org/archives/247

+0

Ich bin nicht sicher, ob ich dieses Recht bekommen:

Ich habe dies nur ganz am Anfang meiner Skript setzen Sie sagen, dass nicht Maketext multibyte ist (das heißt UTF8) sicher? Warum funktionieren meine anderen Lexcions (z. B. arabisch oder chinesisch) und warum funktionieren die deutschen Lexika, sobald ich das utf8-Pragma verwende? Das macht mir noch nichts aus. – tex

+0

Lesen Sie die verlinkte Dokumentation für die Details, die ich im zitierten Auszug weggelassen habe. Ich habe nichts hinzuzufügen. – daxim