Вопрос по perl – Может ли быть 2 разных кодировки UTF-8 для одного и того же символа?

4

Я пишу приложение, которое должно перекодировать свой ввод из UTF-8 в ISO-8859-1 (латиница 1).

Все работает отлично, за исключением того, что иногда я получаю странные кодировки для некоторых умлаутовых символов. Например, латинская 1 E с 2 точками (0xEB) обычно обозначается как UTF-8 0xC3 0xAB, но иногда также как 0xC3 0x83 0xC2 0xAB.

Это происходило несколько раз из разных источников, и, учитывая, что первый и последний символы соответствуют ожидаемым, может ли существовать правило кодирования, о котором моя библиотека не знает?

Ваш Ответ

3   ответа
9

$ "\xC3\x83\xC2\xAB"
ë
$ use Encode

$ decode 'UTF-8', "\xC3\x83\xC2\xAB"
ë

Error: User Rate Limit ExceededError: User Rate Limit ExceededError: User Rate Limit Exceeded

9

Error: User Rate Limit ExceededcomposedError: User Rate Limit ExceededdecomposedError: User Rate Limit ExceededüError: User Rate Limit ExceededüError: User Rate Limit ExceededuError: User Rate Limit Exceeded¨Error: User Rate Limit Exceeded

Error: User Rate Limit ExceededError: User Rate Limit ExceededError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceededjoelonsoftware.com/articles/Unicode.html
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

Error: User Rate Limit ExceededCan there be 2 different UTF-8 encodings for the same character?Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

U+00EB  LATIN SMALL LETTER E WITH DIAERESIS

Error: User Rate Limit Exceeded

U+0065  LATIN SMALL LETTER E
U+0308  COMBINING DIAERESIS

Error: User Rate Limit Exceeded

  • U+00EB: "ë"
  • U+0065,0308: "ë"

Error: User Rate Limit Exceeded

  • U+00EB: C3 AB
  • U+0065: 65
  • U+0308: CC 88

Error: User Rate Limit ExceededError: User Rate Limit ExceededError: User Rate Limit ExceededNFCError: User Rate Limit ExceededNFDError: User Rate Limit Exceeded

$ perl -MUnicode::Normalize -E'
   $x = "\x{00EB}";
   $y = "\x{0065}\x{0308}";

   say     $x  eq     $y  ?1:0;
   say NFC($x) eq NFC($y) ?1:0;
   say NFD($x) eq NFD($y) ?1:0;
'
0
1
1

Error: User Rate Limit Exceeded

1 0xxxxxxx
2 110xxxxx 10xxxxxx
3 1110xxxx 10xxxxxx 10xxxxxx
4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Error: User Rate Limit Exceeded

0000 0000 1110 1011
      --- ---- ----

   -----   ------
110xxxxx 10xxxxxx
11000011 10101011
C3       AB

Error: User Rate Limit Exceeded

0000 0000 1110 1011
---- ---- ---- ----

    ----   ------   ------
1110xxxx 10xxxxxx 10xxxxxx
11100000 10000011 10101011
E0       83       AB

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Похожие вопросы