Używam biblioteki iconv do interfejsu z nowoczesnego źródła wejściowego, które używa UTF-8 do starszego systemu, który używa Latin1, aka CP1252 (nadzbiór ISO-8859-1).Dlaczego iconv może konwertować wstępnie skomponowany formularz, ale nie rozłożyć formy "É" (z UTF-8 na CP1252)
Interfejs ostatnio nie przekonwertował francuskiego ciągu "Éducation", gdzie "É" zostało zakodowane jako hex 45 CC 81
. Zauważ, że kodowanie miejsca docelowego ma znak "É", zakodowany jako C9
.
Dlaczego iconv nie konwersji, że „e”? Sprawdziłem, czy narzędzie wiersza polecenia iconv dostępne w MacOS X 10.7.3 mówi, że nie może się skonwertować, i że moduł PERL iconv również się nie powiedzie.
Jest to tym bardziej zastanawiające, że przekształcona forma znaku "É" (zakodowana jako C3 89
) konwertuje się dobrze.
Jest to błąd z iconv lub coś mnie ominęło?
Zauważ, że mam ten sam problem, jeśli próbuję konwertować z UTF-16 (gdzie "É" jest kodowane jako 00 C9
złożone lub 00 45 03 01
rozłożony).
Dzięki. To nie odpowiada na pytanie, dlaczego iconv odwzorowuje wstępnie skomponowany znak na kodowanie miejsca docelowego, ale nie na (z pewnością odrębną) rozłożoną postać. Dlaczego nie oba? Dlaczego nie ten drugi zamiast poprzedniego? W przypadku narzędzia/biblioteki konwersji jest to awaria, jeśli nie błąd. –
@ Jean-Denis Muys, ponieważ wstępnie skomponowana forma to jeden znak Unicode, który jest reprezentowalny w docelowym kodowaniu zgodnie z tablicami odwzorowania, podczas gdy rozłożony formularz składa się z dwóch znaków Unicode, a drugi nie jest reprezentowany w Windows-1252 (CP1252) . Powiązanie pomiędzy tymi postaciami nie istnieje na poziomie kodowania znaków; jest to problem z wyższym poziomem protokołu (i jest to odpowiednik określonego rodzaju, a nie tożsamości). –
Jesteś w rzeczywistości niepoprawny. Nie ma powodu, aby nie odwzorowywać rozłożonego znaku na jego odpowiednik CP-1252.Niezależnie od tego, czy "É" korzysta z jednej reprezentacji czy z drugiej, może i powinno być odwzorowane na znak CP-1252 "É". –