Получение "ï" ¿"в начале моего XML файла после сохранения()
Я открываю существующий файл XML с С#, и я заменяю некоторые узлы там. Все работает нормально. Сразу после его сохранения я получаю следующие символы в начале файла:
 (EF BB BF in HEX)
Вся первая строка:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Остальная часть файла выглядит как обычный файл XML.
Упрощенный код здесь:
XmlDocument doc = new XmlDocument();
doc.Load(xmlSourceFile);
XmlNode translation = doc.SelectSingleNode("//trans-unit[@id='127']");
translation.InnerText = "testing";
doc.Save(xmlTranslatedFile);
Я использую приложение С# Windows Forms с .NET 4.0.
Любые идеи? Зачем это делать? Можем ли мы это как-то отключить? Это для Adobe InCopy, и он не открывает его так.
UPDATE:
Альтернативное решение:
Сохранение его с помощью XmlTextWriter тоже работает:
XmlTextWriter writer = new XmlTextWriter(inCopyFilename, null);
doc.Save(writer);
Ответы
Ответ 1
Это спецификация UTF-8, которая фактически обескуражена стандартом Unicode:
http://www.unicode.org/versions/Unicode5.0.0/ch02.pdf
Использование спецификации не требуется ни рекомендуется для UTF-8, но может быть встречаются в контекстах, где UTF-8 данные преобразуются из другой кодировки формы, которые используют спецификацию или где спецификация используется как подпись UTF-8
Вы можете отключить его, используя:
var sw = new IO.StreamWriter(path, new System.Text.UTF8Encoding(false));
doc.Save(sw);
sw.Close();
Ответ 2
Это UTF-8 "Оценка байта" (BOM) и ожидается.
Ответ 3
Вы можете попробовать изменить кодировку XmlDocument. Ниже приведен пример, скопированный из MSDN
using System; using System.IO; using System.Xml;
public class Sample {
public static void Main() {
// Create and load the XML document.
XmlDocument doc = new XmlDocument();
string xmlString = "<book><title>Oberon Legacy</title></book>";
doc.Load(new StringReader(xmlString));
// Create an XML declaration.
XmlDeclaration xmldecl;
xmldecl = doc.CreateXmlDeclaration("1.0",null,null);
xmldecl.Encoding="UTF-16";
xmldecl.Standalone="yes";
// Add the new node to the document.
XmlElement root = doc.DocumentElement;
doc.InsertBefore(xmldecl, root);
// Display the modified XML document
Console.WriteLine(doc.OuterXml);
}
}
Ответ 4
Как и все остальные, это проблема с Unicode.
Советую вам попробовать LINQ To XML. Хотя это и не очень важно, я упоминаю об этом как о простом по сравнению со старыми способами, и, что более важно, я предполагаю, что у него могут быть автоматические разрешения на такие проблемы без дополнительного кодирования от вас.