2012-04-04 12 views
8

TomC zaleca dekomponowanie znaków Unicode po drodze i ponowne skomponowanie po drodze (http://www.perl.com/pub/2012/04/perl-unicode-cookbook-always-decompose-and-recompose.html).Dlaczego powinieneś ponownie skomponować Unicode (NFC) w drodze na zewnątrz?

Pierwszy z nich ma dla mnie sens, ale nie rozumiem, dlaczego poleca przekomponowanie go w drodze. Potencjalnie możesz zaoszczędzić trochę miejsca, jeśli twój tekst jest ciężki z europejskimi akcentowanymi znakami, ale po prostu naciskasz to na czyjąś funkcję dekompozycji.

Czy są inne oczywiste powody, których mi brakuje?

Odpowiedz

5

Jak Ven'Tatsu pisze w komentarzu, istnieje oprogramowanie, które może obsłużyć złożone znaki, ale nie rozłożone postacie. Choć teoretycznie jest to możliwe, nigdy nie widziałem tego w praktyce i oczekuję, że będzie to rzadkie.

Aby wyświetlić tylko rozłożony znak, oprogramowanie renderujące musi radzić sobie z łączeniem znaków diakrytycznych. Nie wystarczy znaleźć ich w czcionce. Render musi poprawnie umieścić znak diakrytyczny, używając informacji o wymiarach znaku bazowego. Często pojawiają się w tym problemy, które powodują słabe renderowanie - zwłaszcza jeśli renderowanie używa diakrytycznych czcionek! Rezultat nie może być lepszy niż to, co osiąga się po prostu poprzez wyświetlanie glifu z prekomponowaną postacią, np. "É", zaprojektowaną przez typografa.

(renderowania oprogramowanie może również analizować sytuację i efektywnie odwzorować rozłożony znak do precomposed charakteru. Ale to wymagałoby dodatkowego kodu.)

+0

Ta odpowiedź ma wiele sensu. – petersergeant

0

Ułatwi to np. Edytor tekstu, ponieważ użytkownik końcowy oczekiwałby, że jedna widoczna postać będzie jedną, a nie kilkoma. Zapobiega to również problemom z systemami, które nie traktują rozłożonych znaków jako "pojedynczych" znaków.

Poza tym nie widzę żadnej szczególnej korzyści.

+3

Nie jestem pewien, czy się z tym zgadzam. Nawet w NFC istnieje wiele grafemów, które składają się z więcej niż jednej postaci. Istnieje wiele kombinacji "widocznych char + kombinowanych znaków", które nie mają wersji skomponowanej. –

+0

Być może. Sądzę również, że masz większe szanse na zrozumienie tekstu, jeśli jest nieprawidłowo odczytany jako Latin-1. To nie wygląda na dużą wygraną. – petersergeant

+0

@petersergeant: Nie, to nie zadziała. Tylko znaki 1-128 wyglądają tak samo w Latin-1 i UTF-8. Znaki 129-256 mają tę samą _wartość_, ale różne kodowania. na przykład "é" ma wartość 0xe9. W języku Latin-1 to także jego kodowanie. W UTF-8 staje się 0xc3a9 (dwa bajty). To wyjaśnia powszechne błędy kodowania "Ã ©". http://en.wikipedia.org/wiki/Utf8 zawiera szczegóły. –

2

To dość proste: większość narzędzi ma ograniczone wsparcie dla Unicode; zakładają, że postacie są w formie NFC.

Na przykład, jest powszechnie jak ludzie porównują łańcuchy:

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

I oczywiście, „e” jest w formie NFC (ponieważ to właśnie niemal wszystko produkuje), więc ten program akceptuje tylko argumenty Formularz NFC.

+1

Czy to naprawdę prawda czy przeczucie? Jestem ciekaw, czy gdzieś jest ankieta. –

+0

@ brian d foy, W milionach fragmentów, które widziałem na PerlMonks, prawie nigdy nie widziałem nikogo, kto używa NFC lub NFD, ale widziałem mnóstwo "eq" i "m //". I absolutnie nigdy nie widziałem czegoś w formie NFD. – ikegami

+0

@ brian d foy, Dlaczego pytasz mnie o to i idziesz dalej, by zrobić to samo wyjaśnienie (po prostu bardziej zaciemnione)? Standaryzacja jest potrzebna tylko wtedy, gdy ludzie nie używają swoich danych wejściowych poprzez NFC lub NFD, więc twój post jest odpowiedzią na twoje pytanie. – ikegami

-3

Tom Christiansen jest aktywnym uczestnikiem na StackOverflow i odpowiedzi na wiele pytań Perl . Jest spora szansa, że ​​odpowie na to pytanie.

Pewne sekwencje znaków, takich jak ff można przedstawić UTF-8 albo dwa znaki unikodowe f i f lub jako jeden znak unikodową (ff). Kiedy rozkładają swoich bohaterów, robisz rzeczy takie jak ff stać się dwoma oddzielnymi znakami, które byłyby ważne dla sortowania. Chcesz, aby to sortowanie było dwoma oddzielnymi literami: f.

Po ponownym skomponowaniu UTF-8 f i f, wracają one do pojedynczego znaku UTF-8, który byłby ważny dla wyświetlania (chcesz, aby były ładnie sformatowane) i do edycji (chcesz go edytować jako pojedynczy postać).

Niestety, moja teoria rozpada się z takimi rzeczami jak hiszpański ñ.Jest to reprezentowane jako U + 00F1 jako pojedynczy znak i rozkłada się do U + 006E (n) i U + 0303 (w miejscu ~). Może Perl ma wbudowaną logikę, aby obsłużyć ten typ dwóch rozkładów znaków w rozkładzie UTF-8.

+4

Nie chodzi o to, że wracają do pojedynczej "postaci UTF-8", ale komponują się w jeden kod, który następnie kodujesz. Kodowanie nie ma znaczenia. –

+3

Przepraszam, ale to nie w porządku. 'perl -Municode :: Normalize -E" $ _ = chr (0xFB00), powiedzmy długość _ _; powiedzmy długość NFD $ _; "' Dane wyjściowe są jedno dla obu. "ff" nie rozkłada się na "f" + "f". (NKFD robi, ale to jest coś innego.) Podobnie, "f" + "f" nigdy nie będzie komponowało się z "ff". Po prostu nie są one równoważne. – ikegami

0

Powinieneś jedną formę normalizacji, aby wszystkie dane miały taką samą normalizację, więc dlaczego nie wybrać potencjalnie krótszego?

Co do czyjejś dekompozycji, pamiętaj, że chcesz być surowy w stosunku do tego, co wypowiadasz, ale za to, co akceptujesz. :)

+0

Cóż, wyraźnie sugeruje wykorzystanie obu form, zamiast trzymać się jednej. – petersergeant

Powiązane problemy