Odpowiedź zależy od sposobu, w jaki chcesz użyć tytułu. Dostępne są 3 podstawowe sposoby:
- Bajty reprezentujące łańcuch kodowany w UTF-8.
Jest to format, który powinien zostać użyty, jeśli chcesz przechowywać ciąg znaków zakodowany w UTF-8 poza aplikacją, czy to na dysku, czy też przesłać go przez sieć lub cokolwiek poza zakresem twojego programu.
Pojęcie znaków jest wewnętrzne dla Perla. Kiedy wykonujesz Encode::decode_utf8
, próbuje się konwertować kilka bajtów na ciąg znaków, jak widzi Perl. Perl VM (i programista piszący kod Perla) nie mogą uzewnętrznić tej koncepcji, z wyjątkiem dekodowania bajtów UTF-8 na wejściu i kodowania ich do bajtów UTF-8 na wyjściu. Na przykład twój program otrzymuje dwa bajty jako dane wejściowe, o których wiesz, że reprezentują kodowane znaki UTF-8, na przykład 0xC3 0xB6
. W takim przypadku decode_utf8
zwraca reprezentację, która zamiast dwóch bajtów, widzi jeden znak: ö
.
Następnie można manipulować tym ciągiem w Perlu. Aby dodatkowo zilustrować różnicę rozważmy następujący kod:
my $bytes = "\xC3\xB6";
say length($bytes); # prints "2"
my $string = decode_utf8($bytes);
say length($string); # prints "1"
Specjalny przypadek ASCII podzbiór UTF-8.
ASCII to bardzo mały podzbiór kodu Unicode, w którym znaki z tego zakresu są reprezentowane przez jeden bajt. Konwersja Unicode do ASCII jest z natury stratną operacją, ponieważ większość znaków Unicode nie jest znakami ASCII. Jesteś albo zmuszony upuścić każdy znak w twoim łańcuchu, który nie jest w ASCII, albo spróbuj mapować z postaci Unicode na ich najbliższe odpowiedniki ASCII (co nie jest możliwe w ogromnej większości przypadków), gdy próbujesz przymusić Unicode ciąg do ASCII.
Skoro masz szerokie ostrzeżenia znaków, oznacza to, że starasz się manipulować (ewentualnie wyjściowe) znaki Unicode, które nie mogą być reprezentowane jako ASCII lub ISO-8859-1.
Jeśli nie ma potrzeby manipulowania tytułem z dokumentu XML w postaci ciągu, proponuję pozostawić go jako bajt UTF-8 (wspomnę, że należy uważać, aby nie mieszać bajtów i znaków w smyczki). Jeśli potrzebujesz manipulować nim, dekoduj, manipuluj, a na wyjściu koduj go w UTF-8.
Dla dalszego czytania, skorzystaj perldoc
studiować perlunitut
, perlunifaq
, perlunicode
, perluniintro
i Encode
.
Zasadniczo jest tak, jak podejrzewałem. Moje zrozumienie tego problemu było daleko. Cóż, dziękuję za poświęcenie czasu na wyjaśnienia. Z jakiegoś powodu myślałem, że będę w stanie zmusić mój ciąg znaków UTF8 do jakiejś formy ASCII, która brzmi, jakby to był w najlepszym razie niechlujny hack. Myślę, że po prostu spienięję i zajmę się kodowaniem UTF8. –
Jeśli musisz przekonwertować kodowanie UTF-8 do ASCII, potrzebujesz [Text :: Unidecode] (http://search.cpan.org/perldoc?Text:: Unidecode). – cjm
@cjm Dokładnie to, czego potrzebowałem. Ten konwertuje znaki utf8 do najbliższej wizualnej alternatywy ASCII. Wielkie dzięki! –