Ich möchte Text ausgeben, der aus einer Datenbank in UTF-8 in eine Datei in CP1252 (alias Latin1) kommt. Um das zu tun, verwende ich Text :: Iconv, das funktioniert , es sei denn die Zeichen in der zu konvertierenden Zeichenkette sind zerlegt. Ob das ein Fehler der iconv-Bibliothek ist oder nicht, ist eine Frage, die ich gestellt habe und für die die Antwort nicht offensichtlich ist. Da iconv auf zusammengesetzte Zeichen gut funktioniert, ist die Lösung für meine Saiten zu normalisieren erste, aber ich kann es nicht zu verwalten scheinen zu tun:Normalisierung von Unicode-Zeichenfolgen in Perl
use strict;
use warnings;
use Data::Hexdumper qw(hexdump);
use Unicode::Normalize;
my $v = "É"; # E=U+0045 followed by combining ´=U+0301. UTF-8: 0x45CC81
print "'$v'\n";
print hexdump($v);
my $n = NFC $v; # should be É=U+00C9. UTF-8: 0xC389
print "'$n'\n";
print hexdump($n);
Aber hier ist die Ausgabe erhalte ich:
'É'
0x0000 : 45 CC 81 00 00 00 00 00 00 00 00 00 00 00 00 00 : E...............
'É'
0x0000 : 45 CC 81 00 00 00 00 00 00 00 00 00 00 00 00 00 : E...............
Mit anderen Worten, die NFC-Funktion (convert to Normalization Form C) hat nichts bewirkt. Habe ich etwas vergessen? Ich benutze Perl 5.12.3 unter Mac OS X 10.7.3.
Dies ist nur der Anfang meiner Probleme mit der Textverarbeitung in Perl, die ich nicht erwartet hätte. Danke für jede Hilfe.
Edit: einige Kontext scheint nützlich. Natürlich kann meinem erfundenen Beispiel viel geholfen werden durch eine use utf8
Klausel. Mein aktuelles Problem ist natürlich nicht mit String-Literalen.
Zuerst erkenne ich aus den Antworten, dass ich viel über Perl lernen muss. Tatsächlich bin ich kein Perl-Programmierer, sondern ein Objective-C/Cocoa-Programmierer, bei dem diese Probleme gar nicht auftauchen.
Also begann ich zu lesen, und ich finde die Perl-Dokumentation ziemlich verwirrend, zum Beispiel, wenn es über native Codierung anders als UTF-8 spricht. Was es nicht sagt, ist, wie man das für die Mac OS X Plattform übersetzt, wo UTF-8 die native Kodierung ist.
In jedem Fall der Kontext ist mein Programm produziert Ausgabe in Textdateien, die verschiedene Formate (einschließlich CSV und Unimarc) und mehrere Codierungen (die vier häufigsten sind UTF-8, CP1252, MARC8 und ISO-5426) . Benutzerwahl.
Er erhält seine Eingabe von einer Datenbank (derzeit mySQL oder SQL Server), wo Daten normalerweise in UTF-8 (aber manchmal in CP1252) codiert sind.
Warum die downvote? Die Frage ist klar formuliert und hat Beispielcode. Offensichtlich hat das OP mit Unicode zu kämpfen - so wie es viele Leute in vielen Sprachen tun. Für Anfänger sehen Sie [perlunitut] (http://perldoc.perl.org/perlunitut.html) und [perlunifaq] (http://perldoc.perl.org/perlunifaq.html). – Lumi
CP1252 ist _nicht_ das gleiche wie Latin-1. Latin-1 ist ISO-8859-1. Einzelheiten zu den Unterschieden finden Sie unter http://en.wikipedia.org/wiki/Windows-1252. –
Sie haben Recht, dass ISO-8859-1 und CP1252 nicht genau identisch sind. Ob Latin1 ISO-8859-1 oder CP1252 bezeichnet, bin ich nicht so sicher. Ich habe beides gesehen. Es ist ein Red Herring hier aber –