Как мне сделать XmlDocument.Save () для кодирования = «us-ascii» с цифровыми символами вместо знаков вопроса?
Моя цель - получить двоичный буфер (MemoryStream.ToArray()
дастbyte[]
в данном случае) XML без потери символов Unicode. Я ожидаю, что сериализатор XML будет использовать числовые символьные ссылки для представления чего-либо недопустимого в ASCII. Пока что у меня есть:
using System;
using System.IO;
using System.Text;
using System.Xml;
class Program
{
static void Main(string[] args)
{
var doc = new XmlDocument();
doc.LoadXml("<x>“∞π”</x>");
using (var buf = new MemoryStream())
{
using (var writer = new StreamWriter(buf, Encoding.ASCII))
doc.Save(writer);
Console.Write(Encoding.ASCII.GetString(buf.ToArray()));
}
}
}
Вышеуказанная программа выдает следующий вывод:
$ ./ConsoleApplication2.exe
<?xml version="1.0" encoding="us-ascii"?>
<x>????</x>
Я разобрался как сказатьXmlDocument.Save()
использоватьencoding="us-ascii"
- вручаяTextStream
сTextStream.Encoding
установлен вEncoding.ASCII
. Документация говоритThe encoding on the TextWriter determines the encoding that is written out
, Но как я могу сказать, что я хочу, чтобы он использовал числовые символьные объекты вместо поведения с потерями по умолчанию? Я проверял этоdoc.Save(Console.OpenStandardOutput())
записывает ожидаемые данные (без объявления XML) как UTF-8 со всеми правильными символами, поэтому я знаю, чтоdoc
содержит информацию, которую я хочу сериализовать. Нужно только найти правильный способ сообщить XML-сериализатору, что я хочуencoding="us-ascii"
с персонажами…
Я понимаю, что это может быть нетривиально писать документы XML, которые обаencoding="us-ascii"
и поддерживает такие конструкции, как<π/>
(Я думаю, что это может быть выполнимо только с определениями внешнего типа документа. Да,Я пытался просто для удовольствия.). Но я думал, что было довольно распространено выводить объекты для не-ASCII символов в XML-документе ASCII для поддержки сохранениясодержание а такжезначение атрибута символьные данные в Unicode-недружественных средах. Я думал, что числовые ссылки на символы, представляющие символы Юникода, аналогичны использованию base64 для защиты большого двоичного объекта при сохранении более удобочитаемого содержимого. Как мне сделать это с .NET?