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

D

dimat

Well-known member
31.07.2008
509
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

savl

Lotus team
28.10.2011
2 249
136
Судя по всему либо клиент, либо сервер это воспринимает как Windows-1250
А сам файл нормально открывается?
 
D

dimat

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

savl

Lotus team
28.10.2011
2 249
136
Если есть желание "упороться" и написать свое, то
 
D

dimat

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

ty3uk

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

lmike

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

dimat

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

Serduko

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

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

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

dimat

Well-known member
31.07.2008
509
0
Serduko
с java таже история
 
savl

savl

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

dimat

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

dimat

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

erdi

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

Вложения

D

dimat

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
для преобразования, она кажить - какая из какой, т.е. можно наглядно разглядеть, если получим русский (подбором или автоматически)
 
D

dimat

Well-known member
31.07.2008
509
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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
ЗЫЖ я о перекодировке полученного, а не хранимого в поле
 
Мы в соцсетях:  ТелеграмВконтактеДзенФейсбукТвиттерЮтуб