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

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#1
Всем привет!
Есть агент, на который постом отправляется 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

Well-Known Member
Lotus team
28.10.2011
2 126
163
#2
Судя по всему либо клиент, либо сервер это воспринимает как Windows-1250
А сам файл нормально открывается?
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#3
в файл не сохранял, просто Documentcontext указал форму и сохранил. сейчас попробуй в файл сохранить содержимое поля REQUEST_CONTENT
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#5
записал содержимое в файл - вместо русских символов знаки вопроса
 

ty3uk

Well-Known Member
31.03.2008
170
0
#6
блин, вроде подобное было, тока не помню как исправлял, толи жёстко менял кодировку на вебе (в настройках сайта), толи в хпагесах что-то делал. Не помню.
 

lmike

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

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#8
в файл мне не надо сохранять, в дальнейшем сохранять вобще никуда не надо, нужно принять этот xml и обработать. сейчас сохраняю в нотесдок только для отладки
 

Serduko

Well-Known Member
11.10.2011
170
0
#9
Делайте агент на Java, тогда проблем с кодировкой не будет.

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

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

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#11
dimat
Тогда опишите подробнее, как формируется xml?
Указали что агент постом... и дали код, но там только сохранение, которое мало нам нужно.
Как формируется XML текст?
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#12
savl
Да я бы сам хотел знать, но не знаю, пост ко мне отправляет сервер другой конторы.
Даже не известно что за платформа отправляет, но точно не лотус
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#13
Могу попытаться узнать, что именно нужно у них спросить?
 

erdi

Well-Known Member
20.08.2008
265
36
#14
на сколько понимаю агент на сервере. А какая ОС на сервере? потому как обработка может вестись и с этой кодировкой. Если принять и тупо в ОС сохранить эту xml будут такие же крякозябли как и в документе или уже другие?
может чем-то поможет картинка по определению кодировки
 

Вложения

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#15
erdi
Linux (debian), пробовал в файл сохранять - тоже самое, спасибо за картинку, попробую поределить
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 484
360
#16
тулза для преобразования, она кажить - какая из какой, т.е. можно наглядно разглядеть, если получим русский (подбором или автоматически)
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
#17
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);
 
13.03.2009
625
2
#18
Почему так отображаются русские символы, что можно сделать?
Натыкался на эту гадость.
Это нотусовый баг. Пришедший массив байт (в кодировке 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
6 484
360
#19
turumbay разве mimeE.SetContentFromText(stream, {text/html;charset="UTF-8"}, ENC_NONE) не спасает?
типа:
Код:
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)
' stream.Position=0
' Call stream.Truncate
' Call stream.Close()
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
6 484
360
#20
ЗЫЖ я о перекодировке полученного, а не хранимого в поле