Xpoint
   [напомнить пароль]

MSXML :: xsl:output :: enocode :: UTF-8

Метки: [без меток]
2007-05-07 15:53:32 [обр] kuglik[досье]

Снова про Unicode. Буквально недавно здесь находил тему, где автор поднимал похожий вопрос, но сейчас не могу её отыскать. Придётся повторятся. Проблема в кодировке выходного документа.

Заголовок XSL-файла

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>

Т.е. выходной поток желаю получать в кодировке UTF-8, но он отдаётся в UTF-16.
Как получать выходной поток в требуемой кодировке?

спустя 4 часа 28 минут [обр] Dennis F. Latypoff aka funky_dennis(10/78)[досье]
а как вы определяете, что отдается UTF-16?
спустя 48 минут [обр] kuglik[досье]
Во-первых, визуально, т.е. на выходе русские символы не в UTF-8, а в wide-char Unicode.
Во-вторых, если в XSL определён раздел <head>, то туда добавляется <META http-equiv="Content-Type" content="text/html; charset=UTF-16">.
спустя 1 час 36 минут [обр] Dennis F. Latypoff aka funky_dennis(10/78)[досье]
<xsl:output method="html" encoding="UTF-8" media-type="text/html; charset=UTF-8" />
спустя 22 минуты [обр] kuglik[досье]
Нет, к сожалению, не помогает. Теперь просто добавляет строку с удвоенным charset'ом.
<META http-equiv="Content-Type" content="text/html; charset=UTF-8; charset=UTF-16">
спустя 1 день 17 часов [обр] kuglik[досье]

Dennis F. Latypoff aka funky_dennis[досье]
Спасибо за участие в обсуждении.

Помог решению проблемы ответ на форуме RSDN Re[3]: результат XSLT без кодировки. Пришлось немного переделать функцию transform().

Было

var html = oXMLDoc.transformNode(oXSLDoc);

Стало

var objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = 1 //binary
objStream.Open()
oXMLDoc.transformNodeToObject(oXSLDoc, objStream);
objStream.Position = 0
var html = objStream.Read()

И, соответственно, в месте вызова Response.Write заменяется на Response.BinaryWrite.

Но теперь возникает другая проблема: передача параметров в XSL. Ранее у меня было реализовано две версии функции transform:

  1. два объекта DOMDocument и метод transformNode()
  2. объекты DOMDocument, FreeThreadedDOMDocument, XSLTemplate и метод transform() объекта IXSLProcessor

Во втором варианте возможно было передавать параметры объекту IXSLProcessor. Но с правильными кодировками у меня получилось переделать только первый вариант и как теперь быть с параметрами?

спустя 10 минут [обр] kuglik[досье]
Извиняюсь, в предыдущем сообщении не верно указан ответ подсказавший решение. Не третий, а пятый: Re[5]: результат XSLT без кодировки
спустя 1 день 20 часов [обр] kuglik[досье]
Решилось всё в рамках ASP. Т.е. XSL оказался совсем не при чём. Безо всяких изменений XSL, без бинарных преобразований. Всего-то нужно было в коде страницы указать CodePage = 65001 (UTF-8) в любом из трёх вариантов. Спасибо MSDN'у.
<%@ CODEPAGE = 65001 %> 
<% Session.CodePage = 65001 %> 
<% Response.CodePage = 65001 %>
Powered by POEM™ Engine Copyright © 2002-2005