Текст в кодировке utf-8 приходит с дополнительными символами, почему?

Данные поступают в мое приложение через XML с данными в кодировке utf-8. Текст, который вводит пользователь, сохраняется в XML, а затем мое приложение читает его.

Недавно это не удалось, когда пользователь написал один специальный символ в конце. В результате в XML перед каждым символом стоит дополнительный символ 0x40. Итак, вместо получения:

67 6f 20 61 68 65 61 64 (go ahead)

он получил:

40 67 40 6f 40 20 40 61 40 68 40 65 40 61 40 64 (@g@o@ @a@h@e@a@d)

что пошло не так?

0x40 в двоичном коде - это 01000000, что заставляет меня думать, что 1 - это своего рода управляющий бит, и он пришел в другой кодировке...


person sapeish    schedule 07.02.2011    source источник
comment
Возможно, связано: stackoverflow .com/questions/1169670/   -  person John    schedule 08.02.2011
comment
Вам нужно будет привести реальный пример — что вы подразумеваете под одним специальным символом? Какая программа обработала пользовательский ввод и сгенерировала XML? Как ваше приложение его прочитало (DOM, поток, ...)? Как вы увидели, что там были лишние байты (какую программу вы использовали, которая показала вам лишние байты 0x40)?   -  person Jim Garrison    schedule 08.02.2011
comment
Что ж, кажется, мой хрустальный шар снова разбился. Извините, я не могу помочь.   -  person David Heffernan    schedule 08.02.2011
comment
Это XML с полезной нагрузкой, предположительно закодированной в utf-8: ‹param name=ussd_string payload=406220C64062/> 3 введенных пользователем символа: буква b + фигурная двойная кавычка + буква b Как вы можете видеть в XML, обе буквы b имеют дополнительные 40 перед ними. Данные вводятся с мобильного телефона с помощью USSD, и я понятия не имею и не могу контролировать, как эти данные проходят через сеть к шлюзу, который создает XML... Мне сказали, что сети используют кодировку GSM7bit...   -  person sapeish    schedule 08.02.2011
comment
Какая часть 406220C64062 является фигурной двойной кавычкой? 20С6? Это прямо из GSM7bit?   -  person Stephen Chu    schedule 08.02.2011


Ответы (2)


Если я правильно понимаю, вы говорите, что полезная нагрузка представляет собой строку предположительно байтов UTF-8. то есть

40 62 20 C6 40 62

Но это недопустимый UTF-8. C6 портит его. В UTF-8 никогда не допустимо иметь только один байт > 0x80. Вы можете увидеть это, если вставите приведенное выше (байты с пробелами) в мою маленькую утилиту преобразования. Используйте поле байтов UFT-8).

http://sodved.awardspace.info/unicode.pl

Поэтому я подозреваю, что какой бы инструмент / библиотека вы ни использовали, он сталкивается с недопустимыми данными UTF-8, а затем пытается использовать какой-либо другой способ их обработки. Ни в одной из стандартных кодировок одиночный байт не является C6 фигурной кавычкой. И C6 недействителен в GSM7bit (http://www.developershome.com/sms/gsmAlphabet.asp).

Итак, ваша настоящая проблема в том, что он там делает? Вы уверены в кодировке полезной нагрузки? Даже в стандартном алфавите GSM7 без C6 это кажется странным

¡b ¡b
person Sodved    schedule 06.04.2011

Байты 40 62 20 C6 40 62 недействительны utf-8! Проблема в потерянном стартовом байте C6. C6 находится в двойном 11000110, поэтому это начальный байт 2-байтовой последовательности (поскольку он начинается со 110, остальные 5 битов являются битами полезной нагрузки кодовой точки, равной 110). Но следующий байт для стартового байта отсутствует, так что это недопустимая 2-байтовая последовательность! Возможно, байты НЕ закодированы в кодировке utf, а C6 является символом ANSI e. грамм. один персонаж. Однако C6 выше 127 и поэтому не является символом ASCII. Каждый символ выше 127 должен быть декодирован с правильной последовательностью utf-8 при кодировании в utf-8.

person brighty    schedule 15.01.2014