Pergunta

O seguinte pedaço de código (cortado por brevidade) gera um documento XML, e cospe-lo para um arquivo. Se eu abrir o arquivo no Visual Studio parece ser em caracteres chineses. Se eu abri-lo no bloco de notas, parece que o esperado. Se eu Console.WriteLine que pareça correto.

Eu sei que está relacionada com a codificação, mas se eu tivesse todos os patos de codificação em uma fileira. O que está faltando?

StringBuilder stringBuilder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.Unicode;
settings.Indent = true; 
settings.IndentChars = "\t";
using (XmlWriter textWriter = XmlWriter.Create(new StringWriter(stringBuilder), settings))
{
    textWriter.WriteStartElement("Submission");
    textWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
    textWriter.WriteEndElement();
}

using (StreamWriter sw = new StreamWriter(new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)))
            {
                sw.Write(stringBuilder.ToString());
            }
Foi útil?

Solução

O problema é que você está escrevendo-o para disco usando UTF-8, mas vai reivindicação ser UTF-16 porque é isso que um StringWriter usos por padrão -. e porque você está colocando explicitamente usar Encoding.Unicode bem

A maneira mais simples de corrigir isso é usar um StringWriter que se anuncia como UTF-8:

public class Utf8StringWriter : StringWriter
{
    public override Encoding
    {
         get { return Encoding.UTF8; }
    }
}

... e então remover a linha settings.Encoding = Encoding.Unicode. Dessa forma, você vai usar UTF-8 por toda parte. (Na verdade, a propriedade Encoding de XmlWriterSettings é ignorado quando você cria o XmlWriter com um TextWriter de qualquer maneira.)

Se você realmente deseja UTF-16, então quando você cria o StreamWriter, especifique Encoding.Unicode lá também.

Outras dicas

Eu não tenho certeza do que Encoding.Unicode é, mas eu acho que é UTF-16 que escreve dois bytes por caractere para o arquivo. Para texto normal ASCII, um dos bytes é sempre 0.

Tente UTF-8 vez. Isso deve ter a mesma aparência em qualquer editor menos que você use caracteres especiais (com um ponto de código> = 128).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top