não pode entender esses problemas xml codificação
-
05-07-2019 - |
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());
}
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).