2014-10-28 4 views
2

Мы знаем, что конструктор класса UTF8Encoding может получить необязательный параметр: a bool, определяющий, должен ли кодер предоставлять знак порядка байтов (BOM) или нет.UTF8 Кодирование, не добавляющее отметку порядка байтов

Однако при кодировании один и тот же текст, используя оба подхода, выход тот же:

string text = "Hello, world!"; 
byte[] withBom= new UTF8Encoding(true).GetBytes(text); 
byte[] withoutBom = new UTF8Encoding(false).GetBytes(text); 

Оба withBom и withoutBom имеют одинаковое содержание, один даже не имеет один байт больше, чем другой ,

Почему это происходит? Почему знак байтового байта не добавляется к withBom?

ответ

3

параметр в спецификации конструктора никак не влияет на результат GetBytes, это влияет на результат GetPreamble. Ожидается, что пользователи добавят его вручную.

byte[] bom = new UTF8Encoding(true).GetPreamble(); // 3 bytes 
byte[] noBom = new UTF8Encoding(false).GetPreamble(); // 0 bytes 
+0

Большое спасибо! Вы знаете, почему нужно добавить преамбулу вручную? –

+1

@MatiCicero 'GetBytes' может использоваться и на частичном выходе не только для всей строки. Изготовление спецификации каждый раз не поможет. – Athari

+1

10 000 !!! Ура!!! – Athari

2

спецификации не возвращается с помощью метода UTF8Encoding.GetPreamble:

UTF8Encoding enc = new UTF8Encoding(true); 
byte[] withBom = enc.GetPreamble().Concat(enc.GetBytes(text)).ToArray(); 
+0

+1 показал мне, как добавить его в мои текущие кодированные байты –

+0

@MatiCicero Я бы не рекомендовал использовать этот код для больших строк, хотя. Это создаст слишком много мусора. – Athari

Смежные вопросы