Encoding.UTF8.GetString не удаляет BOM
От: igna Россия  
Дата: 23.10.08 17:17
Оценка:
Почему нижеприведенная программа выводит "?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 }));
    }
}
Re: Encoding.UTF8.GetString не удаляет BOM
От: adontz Грузия http://adontz.wordpress.com/
Дата: 23.10.08 18:41
Оценка:
Здравствуйте, igna, Вы писали:

Читаем стандарт Unicode. В UTF-8 не бывает BOM, только в UTF-16 и UTF-32
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Encoding.UTF8.GetString не удаляет BOM
От: Sergey J. A. Беларусь  
Дата: 24.10.08 07:02
Оценка: 4 (1)
Здравствуйте, 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'е
http://azarkevich.blogspot.com
Re[2]: Encoding.UTF8.GetString не удаляет BOM
От: igna Россия  
Дата: 24.10.08 08:21
Оценка:
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.