2013-05-29 3 views
1

Im, отправляющий XML с HttpPost на сервер. Это было хорошо, и я делал это успешно в других частях проекта.StringBuilder append String breaks UTF 8

Im используя StringBuilder для создания запроса XML, но так как я добавление строк в качестве данных к узлам, я получаю сообщение об ошибке от синтаксического анализа на сервере:

Invalid byte 2 of 2-byte UTF-8 sequence. 

Когда я вхожу запрос и проверить его в валидаторе w3c xml, ошибок нет.
Это отрывок (весь метод будет большим и имеет конфиденциальные данные) из моего StringBuilder метода:

 StringBuilder baseDocument = new StringBuilder(); 
     baseDocument.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><request><setDisposalRequest><customer><company><![CDATA["); 
     baseDocument.append(company); 
     baseDocument.append("]]></company>"); 
     baseDocument.append("<firstName><![CDATA["); 
     baseDocument.append(name); 
     baseDocument.append("]]></firstName>"); 
     ... 

Как только я заменить строку вары я добавить с закодированными строками, все работает отлично

т.е.

baseDocument.append(name); 

в

baseDocument.append("name"); 

Все строки имеют значения, не являющиеся нулевыми или пустыми!
До запроса я установить StringEntity в XML

se.setContentType("application/xml"); 

Что мне не хватает?!?

ответ

1

Ваш заголовок XML утверждает, что это UTF-8, но вы никогда не упоминаете, действительно ли вы написали UTF-8. Убедитесь, что фактические байты, которые вы отправляете, кодируются в кодировке UTF-8. Сообщение об ошибке предполагает, что вы используете другую кодировку (возможно, вариант ISO-8859- *).

Это еще одна причина, что ручное построение XML как это опасно: слишком много угловых случаев для наблюдения, и гораздо проще использовать реальную библиотеку обработки XML. Те имеют тенденцию, чтобы получить правильные угловые шкафы ;-)

И нет: StringBuilder, конечно же, не нарушает UTF-8. Проблема в другом месте.

+0

ok thx, сделаю. Но homecome работает, когда я жестко кодирую строки, как в моем примере? – M4tchB0X3r

+0

Если вы отправляете '' name '', то использование ISO-88591- * не является проблемой, потому что кодировка UTF-8 и кодировка ISO-8859-1 этой строки одинаковы! (как верно для всех строк, которые кодируются в ASCII). Только если вы используете символы, отличные от ASCII (такие как ä, ö, ß и некоторые знаки препинания), будет разница. –

+0

Sweet, thx. Передача параметра UTF-8 в StringEntity сделала трюк. 'se = new StringEntity (reqString, "UTF-8"); И будут умлауты, так как приложение будет для Австрии. Я беру с вашего имени ur от Ger или At;) – M4tchB0X3r

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