Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché Новый топик    Ответить
 кодировка  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2865
Добрый день.
Только начал работать с Cache, поэтому сильно не пинайте.
Пишем web-service.
Задача - метод должен возвращать xml-класса в кодировке windows 1251

что сделано:

set writer = ##class(%XML.Writer).%New()
	
//устанавливаем отступы
set writer.Indent = 1
	
//указываем что писать будем в поток
set xml = ##class(%Stream.TmpCharacter).%New()
do writer.OutputToStream(.xml)
	
//указываем себя, как объект для сериализации
do writer.RootObject($THIS)


если потом посмотреть результат в окне отладчика или вывести в файл, то все хорошо

set f = ##class(%FileCharacterStream).%New()
set f.Filename = "c:\мойфайл.xml"
set f.TranslateTable = "cp1251"
set status = f.CopyFromAndSave(xml)


но проблема в том, что получаемый XML не соответствует необходимому виду
чтобы привести к требуемому виду, делаем XSLT преобразование

set streamxslt = ##class(%Stream.TmpCharacter).%New()
do streamxslt.Write(xslt)

//создаём объект стиля трансформации
Set status=##class(%XML.XSLT.CompiledStyleSheet).CreateFromStream(streamxslt,.pXSL)
	
//создаем объект трансформации и производим её
set Transformer = ##class(%XML.XSLT.Transformer).%New()
set status = Transformer.TransformStreamWithCompiledXSL(xml, pXSL, .resultxml, , , , )


и вот после этого и в файл пишутся "кракозябры" и метод сервиса возвращает "кракозябры"
В окне отладчика все нормально.
Кстати, как лучше поток перевести в строку?

кодировщик показывает, что текст "кракозябров" - это текст в кодировке windows1251 приведенный в utf8

Что можете посоветовать?

I Have Nine Lives You Have One Only
THINK!
13 сен 17, 08:15    [20791727]     Ответить | Цитировать Сообщить модератору
 Re: кодировка  [new]
vassil
Member

Откуда: Хабаровск
Сообщений: 86
Здравствуйте!
Сообщите версию Cache
13 сен 17, 14:42    [20792936]     Ответить | Цитировать Сообщить модератору
 Re: кодировка  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 376
HandKot,

Попробуйте resultxml определить заранее, и установить у него нужную кодировку
13 сен 17, 17:31    [20793497]     Ответить | Цитировать Сообщить модератору
 Re: кодировка  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2865
П.С.М.
HandKot,

Попробуйте resultxml определить заранее, и установить у него нужную кодировку

пробовал не получалось
а как у стрима установить нужную кодировку?

пока нашел такое решение
set result = resultxml.Read(resultxml.Size)
quit $ZCONVERT(result, "I", "UTF8")

в итоге веб сервис возвращает данные в нужной кодировке

vassil
Здравствуйте!
Сообщите версию Cache

Cache for Windows (x86-64) 2017.1.1 (Build 111) Wed May 17 2017 15:55:41 EDT
14 сен 17, 07:06    [20794341]     Ответить | Цитировать Сообщить модератору
 Re: кодировка  [new]
vassil
Member

Откуда: Хабаровск
Сообщений: 86
HandKot
пока нашел такое решение
set result = resultxml.Read(resultxml.Size)
quit $ZCONVERT(result, "I", "UTF8")


Я тоже так делаю ))
16 сен 17, 05:22    [20800279]     Ответить | Цитировать Сообщить модератору
 Re: кодировка  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 763
HandKot,

set streamxslt = ##class(%Stream.TmpCharacter).%New()
#; s streamxslt.TranslateTable = "UTF8" ???
do streamxslt.Write(xslt)
19 сен 17, 19:20    [20807111]     Ответить | Цитировать Сообщить модератору
 Re: кодировка  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2865
doublefint, у %Stream.TmpCharacter нет св-ва TranslateTable
Его я нашел только у %FileCharacterStream
сегодня, 11:45    [20811611]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché Ответить