2012-06-08 3 views
0

Я пытаюсь создать SOAP-вызов с японской строкой. Проблема, с которой я столкнулся, заключается в том, что когда я кодирую эту строку в кодированную строку UTF8, в ней есть много управляющих символов (например, 0x1B (Esc)). Если я удалю все такие управляющие символы, чтобы сделать его действительным SOAP-вызовом, японский контент отображается как мусор на стороне сервера. Как создать действительный запрос SOAP для японских символов? Любое предложение высоко ценится. Я использую C++ с MS-DOM.UTF 8 закодированная японская строка в XML

С наилучшими пожеланиями.

+1

Почему вы говорите, что запрос SOAP с кодировкой UTF-8 недействителен? Сервер не принимает XML с 'encoding =" utf-8 "? –

+2

Эти «контрольные» символы являются частью кодировки японских символов и не должны быть удалены. Что происходит, когда вы их не удаляете? Служит ли вызов SOAP в любом случае? –

+0

Символы utf-8 обязательно должны оставаться внутри сообщения. Возможно, проблема заключается не в самом сообщении, а в создании сообщения. Вы выводили свои данные в виде двоичных файлов, поэтому никакого другого преобразования не произошло? – Thorsten

ответ

3

Если я правильно помню, это верно, первые 32 кодовых обозначения Unicode не разрешены в качестве символов в документах XML, даже с экранами &#. Не уверен, разрешены ли они в HTML или нет, но, конечно, сервер считает, что они не разрешены в ваших запросах, и он получает единственно значимое голосование.

Я заметил, что ваш документ утверждает, что он закодирован в iso-2022-jp, а не utf-8. И действительно, последовательность символов ESC $ B, которая появляется в вашем документе, действительна iso-2022-jp. Он указывает, что данные переключают кодировки (от ASCII до 2-байтовой японской кодировки JIS X 0208-1983).

Но где-то в процессе построения вашего запроса что-то увидело этот байт 0x1B и интерпретировал его как символ U + 001B, не понимая, что он предназначен как один байт в данных, которые уже закодированы в кодировке документа. Таким образом, он имеет XML-экранирование как «лучшее усилие», хотя это недействительный XML.

Возможно, что бы ни сериализовало ваш XML-документ, он не знает, что кодировка должна быть iso-2022-jp. Я полагаю, он считает, что предполагается, что он будет сериализовать документ как ASCII, ISO-Latin-1 или UTF-8, а элемент <meta> ничего не значит для него (это HTML-способ указания кодировки в любом случае, он не имеет особого значения в XML). Но я не знаю MS-DOM, поэтому я не знаю, как это исправить.

Если вы просто удалите ESC символы из данных изо-2022-JP, то вы скрыть тот факт, что данные коммутируемые кодировки, и поэтому декодер будет продолжать интерпретировать все, что 7nMK вещей, как ASCII, когда он должен интерпретироваться как JIS X 0208-1983. Следовательно, мусор.

Что-то еще Чужие - iso-2022-jp код для переключения обратно в ASCII является ESC (B, но я вижу |(B</font> в ваших данных, когда я ожидал бы то же самое произойдет со вторым ESC персонажа, как случилось с первым: &#0x1B(B</font> , Аналогично, $B#M#S(B и [email protected]+(B являются искаженными попытками переключения с ASCII на JIS X 0208-1983 и обратно, и снова символы ESC только что исчезли, а не были экранированы.

У меня нет объяснений, почему некоторые ESC персонажей исчезли, и один из них сбежал, но не может быть совпадением, что то, что вы создаете, выглядит почти, но не совсем, как и действительный iso-2022-jp. Я думаю, iso-2022-jp - это 7-битная кодировка, поэтому частью проблемы может быть то, что вы взяли данные iso-2022-jp и запускаете ее через функцию, которая преобразует ISO-Latin-1 (или некоторые другие 8 битная кодировка, для которой нижняя половина соответствует ASCII, например, любой кодовой странице Windows) для UTF-8. Если это так, то эта функция оставляет 7-битные данные без изменений, они не преобразуют ее в UTF-8. Затем, когда интерпретируется как UTF-8, данные содержат в нем символы ESC.

Если вы хотите отправить данные как UTF-8, то в первую очередь вам нужно будет преобразовать его из iso-2022-jp (в широкие символы или в UTF-8, в зависимости от того, что ожидает ваша SOAP или XML-библиотека).Во-вторых, вам нужно обозначить его как UTF-8, а не как iso-2022-jp. Наконец, вам нужно сериализовать весь документ как UTF-8, хотя, как я уже сказал, вы уже можете это сделать.

0

Как указал Стив Джессоп, похоже, что вы кодировали текст как iso-2022-jp, а не UTF-8. Поэтому первое, что нужно сделать, это проверить это и убедиться, что у вас есть правильный UTF-8.

Если проблема по-прежнему сохраняется, рассмотрите кодировку текста.

Простейшим вариантом является «шестнадцатеричное кодирование», в котором вы просто записываете шестнадцатеричное значение каждого байта в виде цифр ASCII. например байт 0x1B становится «1B», то есть 0x31, 0x42.

Если вы хотите быть фантазией, вы можете использовать MIME или даже UUENCODE.

Смежные вопросы