2012-04-04 2 views
8

TomC empfiehlt, Unicode-Zeichen auf dem Weg zu zerlegen und auf dem Weg nach außen neu zu setzen (http://www.perl.com/pub/2012/04/perl-unicode-cookbook-always-decompose-and-recompose.html).Warum sollten Sie Unicode (NFC) auf dem Weg nach draußen neu zusammensetzen?

Ersteres macht Sinn für mich, aber ich kann nicht sehen, warum er empfiehlt, auf dem Weg nach draußen neu zu erstellen. Möglicherweise können Sie eine kleine Menge Speicherplatz sparen, wenn Ihr Text schwer mit Zeichen mit europäischen Akzenten ist, aber Sie schieben das nur auf die Zerlegungsfunktion einer anderen Person.

Gibt es andere offensichtliche Gründe, die ich vermisse?

Antwort

5

Wie Ven'Tatsu in einem Kommentar schreibt, gibt es Software, die zusammengesetzte Zeichen verarbeiten kann, aber keine zerlegten Zeichen. Obwohl das Gegenteil theoretisch auch möglich ist, habe ich es nie in der Praxis gesehen und erwarte es selten.

Um nur ein zerlegtes Zeichen anzuzeigen, muss die Rendering-Software mit der Kombination von diakritischen Zeichen umgehen. Es reicht nicht aus, sie in der Schriftart zu finden. Der Renderer muss das Diacritic ordnungsgemäß positionieren und dabei Informationen zu den Abmessungen des Basiszeichens verwenden. Es gibt oft Probleme damit, was zu schlechtem Rendering führt - besonders wenn das Rendering das Diakritikum aus einer anderen Schriftart verwendet! Das Ergebnis kann kaum besser sein als das, was man erreicht, wenn man einfach die Glyphe eines vorkompo- nierten Zeichens wie "é" anzeigt, das von einem Typografen entworfen wurde.

(Rendering-Software kann auch die Situation analysieren und effektiv die zerlegt Charakter zu einem vorverfasstes Zeichen abzubilden. Aber das würde zusätzlichen Code erfordern.)

+0

Diese Antwort macht sehr viel Sinn – petersergeant

0

Es würde Dinge wie Texteditoren einfacher machen, da der Endbenutzer erwarten würde, dass ein sichtbares Zeichen ein Zeichen ist, nicht mehrere. Es verhindert auch Probleme mit Systemen, die zerlegte Zeichen nicht als "einzelne" Zeichen behandeln.

Ansonsten sehe ich keinen besonderen Vorteil.

+3

Ich bin mir nicht sicher, ob ich dem zustimme. Sogar in NFC gibt es viele Grapheme, die aus mehr als einem Zeichen bestehen. Es gibt viele "visible char + combining char" -Kombinationen, die keine vorkomposierte Version haben. –

+0

Vielleicht. Ich nehme an, es bedeutet auch, dass Sie Ihren Text besser verstehen, wenn er fälschlicherweise als Latin-1 gelesen wird. Dies scheint jedoch kein großer Gewinn zu sein. – petersergeant

+0

@petersergeant: Nein, das wird nicht funktionieren. Nur die Zeichen 1-128 sehen in Latin-1 und UTF-8 gleich aus. Die Zeichen 129-256 haben denselben _value_, aber unterschiedliche Kodierungen. z.B. 'é' hat den Wert 0xe9. In Latin-1 ist das auch seine Codierung. In UTF-8 wird es 0xc3a9 (zwei Bytes). Das erklärt die üblichen "É" -Encodierungsfehler, die Sie sehen. http://en.wikipedia.org/wiki/Utf8 hat die Details. –

2

Es ist ganz einfach: Die meisten Werkzeuge haben begrenzte Unicode-Unterstützung; sie nehmen an, dass Zeichen in der NFC-Form sind.

Zum Beispiel, ist dies häufig, wie die Menschen Strings vergleichen:

perl -CSDA -e"use utf8; if ($ARGV[0] eq "Éric") { ... }" 

Und natürlich die „E“ ist in NFC-Form (denn das ist, was fast alles produziert), so dass dieses Programm akzeptiert nur Argumente NFC-Formular.

+1

Ist das wirklich wahr oder ein Bauchgefühl? Ich bin neugierig, ob es irgendwo eine Umfrage gibt. –

+0

@brian d foy, In den Millionen Schnipsel, die ich auf PerlMonks gesehen habe, habe ich (fast?) Nie gesehen, dass irgendjemand NFC oder NFD benutzt, aber ich habe viele 'eq' und' m // 'gesehen. Und ich habe absolut nie etwas in NFD-Form gesehen. – ikegami

+0

@brian d foy, Warum frag mich dazu und mache weiter die gleiche Erklärung (nur mehr verschleiert)? Standardisierung wird nur benötigt, wenn Personen ihre Eingabe nicht über NFC oder NFD weitergeben, also ist Ihr eigener Beitrag eine Antwort auf Ihre Frage. – ikegami

-3

Tom Christiansen ein aktiver Teilnehmer auf Stackoverflow ist und beantwortet viele Perl Fragen . Es besteht eine gute Chance, dass er diese Frage beantwortet.

bestimmte Zeichenfolge wie ff können in UTF-8 entweder als zwei Unicode Zeichen f und f, oder als ein einzelnes Unicode-Zeichen (ff) dargestellt werden. Wenn Sie zerlegen Ihre Zeichen, machen Sie Dinge wie ff werden zwei separate Zeichen, die für die Sortierung wichtig wäre. Sie möchten, dass dies zwei separate Buchstaben f beim Sortieren sind.

Wenn Sie UTF-8 f und f neu zusammensetzen, kehren sie zum einzelnen UTF-8-Zeichen zurück, das für die Anzeige wichtig ist (Sie wollen sie schön formatieren) und für die Bearbeitung (Sie möchten es einzeln bearbeiten) Charakter).

Leider fällt meine Theorie mit Dingen wie der spanischen ñ auseinander.Dies wird als U + 00F1 als einzelnes Zeichen dargestellt und zerfällt in U + 006E (n) und U + 0303 (in Place ~). Vielleicht hat Perl die Logik eingebaut, um mit dieser Art von zwei UTF-8-Dekompositionszeichen umzugehen.

+4

Es ist nicht so, dass sie zurück zu einem einzigen "UTF-8-Zeichen" gehen, sondern dass sie zu einem einzigen Codepunkt zusammensetzen, den Sie dann verschlüsseln. Die Codierung spielt keine Rolle. –

+3

Sorry, aber das ist falsch. 'perl -MUnicode :: Normalize -E" $ _ = chr (0xFB00); sag length $ _; sag length NFD $ _; "Output ist eins für beide. "ff" zerfällt nicht zu "f" + "f". (NKFD tut das, aber das ist etwas anderes.) Ähnlich wird "f" + "f" niemals zu "ff" zusammengesetzt. Sie sind einfach nicht gleichwertig. – ikegami

0

Sie sollten eine Normalisierungsform, so dass alle Daten die gleiche Normalisierung haben, also warum nicht die potenziell kürzere wählen?

Bei der Zerlegung eines anderen, denken Sie daran, dass Sie streng sein wollen mit dem, was Sie ausgeben, aber liberal mit dem, was Sie akzeptieren. :)

+0

Nun, er schlägt ausdrücklich vor, beide Formen zu verwenden, statt sich an einen zu halten. – petersergeant

Verwandte Themen