XmlWriter, кодирующий проблемы

Поскольку aLista очень ограничен в размерах и bListb потенциально огромен, вам следует преобразовать aLista в Set, а не bListb.

Set<String> missing = new HashSet<>(aLista);
for (String s : bListb) {
    if (missing.isEmpty())
        break;
    missing.remove(s);
}

Код даже закоротит итерацию bListb, если все значения будут найдены, тогда как преобразование bListb в Set не позволит такую ​​логику короткого замыкания.

6
задан John 14 May 2009 в 13:50
поделиться

5 ответов

Здесь найдено одно решение: http://www.timvw.be/generating-utf-8-with-systemxmlxmlwriter/

Мне не хватало этого вверху:

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Encoding = new UTF8Encoding(false);
MemoryStream ms = new MemoryStream();
XmlWriter w = XmlWriter.Create(ms, xmlWriterSettings);

Всем спасибо за помощь!

13
ответ дан 8 December 2019 в 14:46
поделиться

Проблема в том, что ваш XML, созданный писателем, имеет формат UTF-16, тогда как вы используете UTF-8 для преобразования его в строку. Попробуйте вместо этого:

StringBuilder sb = new StringBuilder();
using (StringWriter writer = new StringWriter(sb))
using (XmlWriter w = XmlWriter.Create(writer))
{
    w.WriteStartDocument(true);
    w.WriteStartElement("data");

    w.WriteElementString("child", "myvalue");

    w.WriteEndElement();//data
}

string test = sb.ToString();
2
ответ дан 8 December 2019 в 14:46
поделиться

Вы можете изменить кодировку следующим образом:

w.Settings.Encoding = Encoding.UTF8;
0
ответ дан 8 December 2019 в 14:46
поделиться

Все это немного не работает, если вам важна метка порядка байтов, которую используют редакторы (например, Visual Studio определяет XML в кодировке UTF8 и правильно выделяет синтаксис).

Вот решение:

MemoryStream stream = new MemoryStream();

XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.Indent = true;
settings.IndentChars = "\t";

using (XmlWriter writer = XmlWriter.Create(stream, settings))
{
    // ... write

    // Make sure you flush or you only get half the text
    writer.Flush();

    // Use a StreamReader to get the byte order correct
    StreamReader reader = new StreamReader(stream,Encoding.UTF8,true);
    stream.Seek(0, SeekOrigin.Begin);
    result = reader.ReadToEnd();
}

У меня есть 2 фрагмента полностью здесь

0
ответ дан 8 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: