Принятые Данные Из Вне - Крокозябры

dimat

Well-known member
31.07.2008
508
0
BIT
0
Всем привет!
Есть агент, на который постом отправляется xml документ, все отлично принимается, но русские буквы приходят вот в таком виде (вернее отображаются в сохраненном доке): ðÜÐÇð░Ðüð¢ð¥ð .
кот агента:

Код:
	Set ns=New NotesSession
Set db=ns.currentdatabase
Dim pdoc As NotesDocument
Set pdoc=ns.Documentcontext
pdoc.form="REQUEST_CONTENT"
Call pdoc.Save(True,False)

Со стороны отправителя говорят что отправляют в UTF-8, попробовал содержимое поля REQUEST_CONTENT загнать в NotesStream и посмотреть Charset - Unicode.
Почему так отображаются русские символы, что можно сделать?

Скрин открытого документа в форме:
2014_10_08_09_42_45_Скриншот_экрана.png
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
540
Судя по всему либо клиент, либо сервер это воспринимает как Windows-1250
А сам файл нормально открывается?
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
в файл не сохранял, просто Documentcontext указал форму и сохранил. сейчас попробуй в файл сохранить содержимое поля REQUEST_CONTENT
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
540
Если есть желание "упороться" и написать свое, то
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
записал содержимое в файл - вместо русских символов знаки вопроса
 
T

ty3uk

блин, вроде подобное было, тока не помню как исправлял, толи жёстко менял кодировку на вебе (в настройках сайта), толи в хпагесах что-то делал. Не помню.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
сохранение в файл - надо указывать кодировку, иначе (в виндятке) используется вин1251
юникод тоже бывает разный UTF-8 (этот в *nix), UTF-16 (этот юзает виндятко) ...
если пытаться смотреть результат хмл из потока (в нотусне), без обработки (например через майм) - будут кракозябры (ибо оно хочет для платформы казать и пытается 1251)
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
в файл мне не надо сохранять, в дальнейшем сохранять вобще никуда не надо, нужно принять этот xml и обработать. сейчас сохраняю в нотесдок только для отладки
 
S

Serduko

Делайте агент на Java, тогда проблем с кодировкой не будет.

А так через майм, например:

Код:
mimeE.SetContentFromText(stream, {text/html;charset="UTF-8"}, ENC_NONE)
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
540
dimat
Тогда опишите подробнее, как формируется xml?
Указали что агент постом... и дали код, но там только сохранение, которое мало нам нужно.
Как формируется XML текст?
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
savl
Да я бы сам хотел знать, но не знаю, пост ко мне отправляет сервер другой конторы.
Даже не известно что за платформа отправляет, но точно не лотус
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
Могу попытаться узнать, что именно нужно у них спросить?
 

erdi

Green Team
20.08.2008
264
17
BIT
0
на сколько понимаю агент на сервере. А какая ОС на сервере? потому как обработка может вестись и с этой кодировкой. Если принять и тупо в ОС сохранить эту xml будут такие же крякозябли как и в документе или уже другие?
может чем-то поможет картинка по определению кодировки
 

Вложения

  • charset_detection.png
    charset_detection.png
    48 КБ · Просмотры: 852

dimat

Well-known member
31.07.2008
508
0
BIT
0
erdi
Linux (debian), пробовал в файл сохранять - тоже самое, спасибо за картинку, попробую поределить
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
для преобразования, она кажить - какая из какой, т.е. можно наглядно разглядеть, если получим русский (подбором или автоматически)
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
Post запрос шлется curlom из php

Вот кусок
PHP:
$response = new DOMDocument("1.0","utf-8");
...
$ch = curl_init($this->__listener);
$data = array(
''guid'' => $guid,
''content'' => $response->saveXML()
);
...
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
....
$result = curl_exec($ch);
 
T

turumbay

Почему так отображаются русские символы, что можно сделать?
Натыкался на эту гадость.
Это нотусовый баг. Пришедший массив байт (в кодировке UTF) пишется в поле документа без перекодировки и в дальнейшем воспринимается как LMBCS.
Т.е. строка "абра" приходит как "d0 b0 d0 b1 d1 80 d0 b0" и прямо так и кладется в поле. Т.к. notes хранит все в кодировке LMBCS, то при чтении данных из поля, данные байты декодятся в кракозябры.
В случае, если бы строка "абра" писалась стандарными нотусовыми методами - она лежала бы в поле как "14 04 30 14 04 31 14 04 40 14 04 30"

Вариантов решения несколько:
- выдернуть значение поля сишным апи в виде массива байт, перекодировать их (utf -> lmbcs) и положить обратно. Это низкоуровневое кунг-фу
- заставить клиента отправлять данные не в виде голого xml(application/xml), а по нотусовой форме (multipart-form-data). Это обчно не катит, т.к. ломает существующий протокол обмена.
- переписать агента на XPage с использованием Servlet API. Это оптимальный выбор, если не нужна поддержка семерки.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
turumbay разве mimeE.SetContentFromText(stream, {text/html;charset="UTF-8"}, ENC_NONE) не спасает?
типа:
Visual Basic:
Function EncodeMime(s As String, enc As String) As String
   Dim ses As New NotesSession
   Dim doc As notesdocument
   Dim db As notesdatabase
   Dim body As NotesMimeEntity
   Dim tmpStrm As NotesStream

   EncodeMime = ""
   ses.ConvertMIME = False
   Set tmpStrm = ses.CreateStream
   Set db = ses.CurrentDatabase
   Set doc = db.createdocument
   Call tmpStrm.WriteText(s)
   Set body = doc.CreateMIMEEntity
   Call body.SetContentFromText(tmpStrm, "text/plain; charset=UTF-8", ENC_NONE)
   Call body.EncodeContent(enc)

   Dim content As String
   content = body.ContentAsText
   EncodeMime = content
   'Print body.Encoding
   ses.ConvertMIME = True
End Function
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
ЗЫЖ я о перекодировке полученного, а не хранимого в поле
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!