У меня есть следующий фрагмент кода:
using (Stream stream = new MemoryStream())
{
xslt.Transform(document, xslArg, stream);
stream.Seek(0, SeekOrigin.Begin);
StreamReader reader = new StreamReader(stream);
var result = reader.ReadToEnd();
return result;
}
Это преобразование выводит документ HTML.Что меня удивляет, так это то, что, хотя вход xsl содержит:
<html>
<head>
<style>
@page Section1
{size:612.0pt 792.0pt;
margin:42.55pt 42.55pt 42.55pt 70.9pt;
mso-header-margin:35.45pt;
mso-footer-margin:35.45pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
</head>
<body>
<div class="Section1">
.....
, вывод:
<html xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>.....
, как вы видите, информация о кодировке была добавлена, помимо прочего.
Но что меня поразило, так это то, что когда я изменил код, который преобразует в:
StringBuilder sb = new StringBuilder();
using (StringWriter writer = new StringWriter(sb))
{
xslt.Transform(document, xslArg, writer);
}
var result = sb.ToString();
return result;
сгенерированный вывод имел следующую форму:
<html xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-16">
<style>....
Как вывидно, кодировка изменилась.Я полагаю, это потому, что StringBuilder и .NET по умолчанию работают с использованием UTF-16.Но почему в любом случае преобразование добавляет метатег к charset?