Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.200.66] |
|
Сообщ.
#1
,
|
|
|
Работаю над клиент-серверным приложением
Подскажите как правильно отправить в POST запросе готовый TXMLdocument и как правильно его принять и обработать на стороне сервера, а точнее как правильно из принятого запроса IDhttpServer загрузить данные в TXMLdocument для дальнейшей обработки (желательно SaveToFile и LoadFromFile не использовать) |
Сообщ.
#2
,
|
|
|
SaveTo/LoadFromStream?
|
Сообщ.
#3
,
|
|
|
Это уже вкурил. Вылезла следующая проблема...
idhttp принимает запрос (с русским всё хорошо) создаю tstringlist и в него сохраняю мой запрос (тоже все хорошо. Для проверки сохраняю в файл) tstringlist сохраняю saveToStream (тоже все хорошо. Для проверки сохраняю в файл) xml.LoadFromStream ... и здесь начинается проблема. Если пришел xml без кириллицы то загружается нормально, но если есть хоть один символ кириллицы то не загружается и всё... Может подскажете как это победить? |
Сообщ.
#4
,
|
|
|
Попробуй сохранять xml в utf8.
|
Сообщ.
#5
,
|
|
|
Отправляю на idhttpserver в кодировке UTF8, для этого перед отправкой запроса, на IDHTTP включаю
const CONT_TYPE='application/x-www-form-urlencoded'; SHR_SET='utf-8'; ... begin http1.Request.ContentType :=CONT_TYPE; http1.Request.Charset :=SHR_SET; ... После этого русский от клиента к серверу идет нормально (на эту тему я писал здесь) Русский по http идет нормально, удачно сохраняется в tstringlist и затем в TMemoryStream, а вот уже из tmemorystream txmldocument.loadfromstream(stream)... // вот здесь ошибка если есть русский Может Fr0sT подскажешь как принудительно в моём случае сохранить сначала TStringlist , а затем и TMemoryStream в кодировке UTF8 |
Сообщ.
#6
,
|
|
|
Цитата dreyqq @ Это уже вкурил. Вылезла следующая проблема... idhttp принимает запрос (с русским всё хорошо) создаю tstringlist и в него сохраняю мой запрос (тоже все хорошо. Для проверки сохраняю в файл) tstringlist сохраняю saveToStream (тоже все хорошо. Для проверки сохраняю в файл) xml.LoadFromStream ... и здесь начинается проблема. Если пришел xml без кириллицы то загружается нормально, но если есть хоть один символ кириллицы то не загружается и всё... Может подскажете как это победить? Уже ж говорил в другом посте: Цитата Дело в том, что XML - это не текст. Это байтовый поток, который для большинства случаев выглядит как текст. Т.е. если взять вот это вот и сохранить как текстовый файл, оно НЕ прочитается ни одним вменяемым XML-парсером: <?xml version="1.0" encoding="UTF-8"?> <hamlet> <line>Есть многое в природе, друг Горацио,</line> <line>Что и не снилось нашим мудрецам.</line> </hamlet> Первая реакция "да что за нафик, все теги закрыты, чё за дела, братан". А на самом деле, правильный поток байтов для такого русскоязычного XML будет очень неочевидным. И это ещё не говоря про BOM-префикс, который может быть, а может и отсутствовать! Вот он, подлец, первые три байта занимает, EF BB BF 0000000000: EF BB BF 3C 3F 78 6D 6C │ 20 76 65 72 73 69 6F 6E �››<?xml version 0000000010: 3D 22 31 2E 30 22 20 65 │ 6E 63 6F 64 69 6E 67 3D ="1.0" encoding= 0000000020: 22 55 54 46 2D 38 22 3F │ 3E 0D 0A 3C 68 61 6D 6C "UTF-8"?>♪◙<haml 0000000030: 65 74 3E 0D 0A 20 20 20 │ 20 3C 6C 69 6E 65 3E D0 et>♪◙ <line>Е 0000000040: 95 D1 81 D1 82 D1 8C 20 │ D0 BC D0 BD D0 BE D0 B3 ›с›т›ь› м›н›о›г› 0000000050: D0 BE D0 B5 20 D0 B2 20 │ D0 BF D1 80 D0 B8 D1 80 о›е› в› п›р›и›р› 0000000060: D0 BE D0 B4 D0 B5 2C 20 │ D0 B4 D1 80 D1 83 D0 B3 о›д›е›, д›р›у›г› 0000000070: 20 D0 93 D0 BE D1 80 D0 │ B0 D1 86 D0 B8 D0 BE 2C Г›о›р›а›ц›и›о›, 0000000080: 3C 2F 6C 69 6E 65 3E 0D │ 0A 20 20 20 20 3C 6C 69 </line>♪◙ <li 0000000090: 6E 65 3E D0 A7 D1 82 D0 │ BE 20 D0 B8 20 D0 BD D0 ne>Ч›т›о› и› н›е 00000000A0: B5 20 D1 81 D0 BD D0 B8 │ D0 BB D0 BE D1 81 D1 8C › с›н›и›л›о›с›ь› 00000000B0: 20 D0 BD D0 B0 D1 88 D0 │ B8 D0 BC 20 D0 BC D1 83 н›а›ш›и›м› м›у› 00000000C0: D0 B4 D1 80 D0 B5 D1 86 │ D0 B0 D0 BC 2E 3C 2F 6C д›р›е›ц›а›м›.</l 00000000D0: 69 6E 65 3E 0D 0A 3C 2F │ 68 61 6D 6C 65 74 3E ine>♪◙</hamlet> |
Сообщ.
#7
,
|
|
|
В stringlist приходит в родной кодировке Дельфей, это utf16. соответственно и дальше идет она. Сохрани в файл и посмотри hex редактором, что там на самом деле.
|
Сообщ.
#8
,
|
|
|
Цитата Mr.Delphist @ Уже ж говорил в другом посте: Цитата Дело в том, что XML - это не текст. Это байтовый поток, который для большинства случаев выглядит как текст. Далана, наличие БОМ не делает текстовик байтданными |
Сообщ.
#9
,
|
|
|
Цитата Gonarh @ Далана, наличие БОМ не делает текстовик байтданными Да, метка BOM опциональна. Но для самого тела файла это не отменяет факта, что буква "как бы текста" будет представлена одним или несколькими байтами, смотрим хекс-дамп в предыдущем сообщении. А уж если в тексте появятся эмоджи-символы... |
Сообщ.
#10
,
|
|
|
Вопрос с передачей русского через MemoryStream решил
Если ком поможет то вот: srvZap:=tstringlist.Create; srvZap.Text:=ARequestInfo.Params.Text; zapStream:=TMemoryStream.Create; srvZap.SaveToStream(zapStream, Tencoding.UTF8); // вот так нормально принимает русский |