Фрагмент говорит сам за себя: -)
UTF8Encoding enc = new UTF8Encoding(true/*include Byte Order Mark*/); byte[] data = enc.GetBytes("a"); // data has length 1. // I expected the BOM to be included. What's up?
Вы не хотите, чтобы он использовался для каждого вызова GetBytes, иначе у вас не будет возможности (скажем) записать файл в строку за раз.
Предоставляя GetPreamble , вызывающие абоненты могут вставить преамбулу только в соответствующую точку (то есть в начале своих данных). Я согласен с тем, что документация может быть намного понятнее.
Спасибо вам обоим. Следующие работы, и LINQ делает комбинацию простой: -)
UTF8Encoding enc = new UTF8Encoding(true); byte[] data = enc.GetBytes("a"); byte[] combo = enc.GetPreamble().Concat(data).ToArray();
Поскольку ожидается, что GetBytes() будет вызываться много раз ... вам нужно использовать:
GetBytes()
byte[] preamble = enc.GetPreamble();
(вызывайте его только в начале последовательности) и запишите это; это , где живет спецификация.
Обратите внимание, что в общем случае вам не нужна метка порядка байтов для UTF-8. Его главная цель - отличить UTF16 BE и UTF16 LE. UTF8 LE и UTF8 BE не существует.