Файл сохраняется в формате UTF16. В чем может быть проблема?

#c#

#c#

Вопрос:

Я пытаюсь сохранить XML-строку как файл, файл сохраняется в формате UTF16. В чем может быть проблема?

 private void SaveFile(string xmlData, string fileName)
{
    File.WriteAllText(fileName, xmlData, Encoding.UTF8);
}
  

Несмотря на то, что я упомянул кодировку как UTF8, файл все равно сохраняется в формате UTF16.

Комментарии:

1. Как вы сериализуете строку xmlData?

2. вы уверены, что говорите о формате файла, а не о заголовке в XML?

3. Как вы проверили формат файла?

4. File.WriteAllText() Известно, что этот метод работает корректно. Вы указываете Encoding.UTF8 , и это будет соблюдено. Единственными правдоподобными объяснениями того, что вы описываете, являются следующие: 1. Вы дважды закодировали текст при создании xmlData . 2. UTF-16, о котором вы сообщаете, соответствует тому, что указано в заголовке XML. Суть в том, что ошибка должна быть найдена в коде, который не может быть виден в вопросе.

5. Добавим к комментарию Cadburry, что XML-строка, которую вы пытаетесь сохранить, может содержать encoding="utf-16" , но это не означает, что файл находится в этом формате.

Ответ №1:

Я предполагаю, что вы сделали что-то вроде:

 string xml;
using(var sw = new StringWriter()) {
    xmlSerializer.Serialize(sw, obj);
    xml = sw.ToString();
}
  

в этом случае да, xml будет внутренне объявлять utf-16, потому что он правильно определил, что он записывает во что-то, что по своей сути является utf-16. Вероятно, есть способы обойти это в writer ( XmlWriterSettings.Encoding , например), но лучшим подходом было бы либо:

  • для записи / сериализации непосредственно в файл, например, через StreamWriter в файл
  • для записи / сериализации в MemoryStream , а не в StringWriter , поскольку MemoryStream не имеет встроенной кодировки utf-16

Кодировка файла не совсем совпадает с заявленной кодировкой в xml; если в xml в виде строки указано utf-16, это волшебным образом не изменится только потому, что вы записываете строку как utf-8