Почему я получаю дополнительный символ (точку или точку маркера) в начале моего байтового массива? - PullRequest
3 голосов
/ 11 августа 2009

У меня есть следующий код, используемый для получения XML из DataSet в байтовый массив с использованием кодировки UTF-8:

private static byte[] fGetXmlBytes(DataTable lvDataTable)
{
  XmlWriterSettings lvSettings = new XmlWriterSettings();
  lvSettings.Encoding = Encoding.UTF8;
  lvSettings.NewLineHandling = NewLineHandling.Replace;
  lvSettings.NewLineChars = String.Empty;

  using(MemoryStream lvMemoryStream = new MemoryStream())
  using (XmlWriter lvWriter = XmlWriter.Create(lvMemoryStream, lvSettings))
  {
    lvDataTable.WriteXml(lvWriter, XmlWriteMode.IgnoreSchema);
    //Lines used during debugging
    //byte[] lvXmlBytes = lvMemoryStream.GetBuffer();
    //String lsXml = Encoding.UTF8.GetString(lvXmlBytes, 0, lvXmlBytes.Length);
    return lvMemoryStream.GetBuffer();
  }
}

Я хочу байтовый массив, потому что впоследствии я передаю данные процедурам сжатия и шифрования, которые работают с байтовыми массивами. Проблема в том, что я получаю дополнительный символ в начале XML. Вместо:

<?xml version="1.0" encoding="utf-8"?><etc....

Я получаю

.<?xml version="1.0" encoding="utf-8"?><etc....

Кто-нибудь знает, почему персонаж там? Есть ли способ предотвратить добавление персонажа? Или легко раздеться?

Colin

Ответы [ 4 ]

13 голосов
/ 11 августа 2009

Вам придется использовать класс Encoding, который не создает преамбулу. Объект, возвращаемый Encoding.UTF8, выдаст преамбулу, но вы можете создать свой собственный UTF8Encoding, который не генерирует преамбулу, например:

lvSettings.Encoding = new UTF8Encoding(false);

Преамбула UTF-8 - это метка порядка байтов UNICODE (U + FEFF), закодированная с использованием UTF-8. Цель метки порядка байтов UNICODE состоит в том, чтобы указать порядковый номер (порядок байтов) 16-битных кодовых единиц потока. Если начальные байты в потоке равны 0xEF 0xFF, то поток имеет старший порядковый номер; в противном случае, если начальные байты равны 0xFF 0xEF, поток имеет младший порядковый номер.

U + FEFF, кодированный с использованием UTF-8, приводит к байтам 0xEF 0xBB 0xBF и несколько иронично, поскольку UTF-8 кодирует в последовательность 8-битных байтов, порядок байтов больше не имеет значения.

6 голосов
/ 11 августа 2009

Преамбула что ли? Информация здесь: http://www.firstobject.com/dn_markutf8preamble.htm

0 голосов
/ 11 августа 2009

Я делаю в основном то же самое с этим кодом, и он отлично работает:


MemoryStream data = new MemoryStream(1000);
datatable.WriteXml(data);
return data.toArray();
0 голосов
/ 11 августа 2009

Дополнительный символ - преамбула UTF-8. AFAIK, вы не можете предотвратить запись преамбулы в поток. Однако действительно ли это имеет значение? Когда байтовый массив анализируется обратно в XML, преамбула будет правильно интерпретирована без ошибок, так что вы могли бы просто оставить ее там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...