Почему нижеприведенная программа выводит "?A", а не просто "A" и как сделать, чтобы BOM удалялся?
using System;
using System.Text;
static class Program
{
static void Main() {
Console.WriteLine(Encoding.UTF8.GetString(new byte[] { 0xEF, 0xBB, 0xBF, 0x41 }));
}
}
Здравствуйте, igna, Вы писали:
I>Почему нижеприведенная программа выводит "?A", а не просто "A" и как сделать, чтобы BOM удалялся?
I>I>using System;
I>using System.Text;
I>static class Program
I>{
I> static void Main() {
I> Console.WriteLine(Encoding.UTF8.GetString(new byte[] { 0xEF, 0xBB, 0xBF, 0x41 }));
I> }
I>}
I>
2 варианта:
1. загнать байты в MemoryStream и прочитать StreamReader'ом. StreamReader умеет скипать BOM (а вернее сказать Preamble, т.к. для UTF8 BOM не имеет смысла)
using(StreamReader sr = new StreamReader(
new MemoryStream(new byte[] { 0xEF, 0xBB, 0xBF, 0x41 }),
System.Text.Encoding.UTF8))
{
string t = sr.ReadToEnd();
}
2. Самому удалять лишнее. Что конкретно отностится к BOM можно вычитать с помощъю Encoding.UTF8.GetPreamble(). Пример можно подсмотреть в том-же StreamReader'е
Здравствуйте, adontz, Вы писали:
A>Читаем стандарт Unicode. В UTF-8 не бывает BOM, только в UTF-16 и UTF-32
"In UTF-8, the BOM corresponds to the byte sequence <EF16 BB16 BF16>" (The Unicode Standard, Version 5.0)
Хотя формально ты прав, это не
BOM, а
byte sequence to which the BOM corresponds.