Глава.14 .Символы,.строки.и.обработка.текста
Вот результат выполнения этой программы:
Encoded bytes: 48-69-20-74-68-65-72-65-2E
Decoded string: Hi there.
Помимо
UTF8
, у класса
Encoding
есть и другие статические свойства:
Unicode
,
BigEndianUnicode
,
UTF32
,
UTF7
,
ASCII
и
Default
. Последнее возвращает объект,
который выполняет кодирование и декодирование с учетом кодовой страницы
пользователя, заданной с помощью утилиты Regional and Language Options (Язык
и региональные стандарты) панели управления (см. описание Win32-функции
GetACP
). Однако свойство
Default
применять не рекомендуется, потому что по-
ведение приложения будет зависеть от настройки машины, то есть при изменении
кодовой таблицы, предлагаемой по умолчанию, или выполнении приложения на
другой машине приложение поведет себя иначе.
Наряду с перечисленными свойствами, у
Encoding
есть статический метод
GetEncoding
, позволяющий указать кодовую страницу (в виде числа или строки).
Метод
GetEncoding
возвращает объект, выполняющий кодирование/декодирование,
используя заданную кодовую страницу. Например, можно вызвать
GetEncoding
с параметром
"Shift-JIS"
или 932.
При первом запросе объекта кодирования свойство класса
Encoding
(или его
метод
GetEncoding
) создает и возвращает объект для требуемой кодировки. При
последующих запросах такого же объекта будет возвращаться уже имеющийся
объект; то есть при очередном запросе новый объект не создается. Благодаря этому
сокращается число объектов и снижается нагрузка на кучу.
Кроме статических свойств и метода
GetEncoding
класса
Encoding
, для созда-
ния экземпляра класса кодирования можно задействовать классы
System.Text.
UnicodeEncoding
,
System.Text.UTF8Encoding
,
System.Text.UTF32Encoding
,
System.
Text.UTF7Encoding
или
System.Text.ASCIIEncoding
. Только помните, что в этих
случаях в управляемой куче появятся новые объекты, что неминуемо отрицательно
скажется на производительности.
У классов
UnicodeEncoding
,
UTF8Encoding
,
UTF32Encoding
и
UTF7Encoding
есть
несколько конструкторов, дающих дополнительные возможность в плане управле-
ния процессом кодирования и
маркерами последовательности байтов
(Byte Order
Mark, BOM). Первые три класса также имеют конструкторы, которые позволяют
заставить класс генерировать исключение при декодировании некорректной по-
следовательности байтов; эти конструкторы нужно использовать для обеспечения
безопасности приложения и защиты от приема некорректных входных данных.
Возможно, при работе с
BinaryWriter
или
StreamWriter
вам придется явно соз-
давать экземпляры этих классов. У класса
ASCIIEncoding
лишь один конструктор,
и поэтому возможности управления кодированием здесь невелики. Получать объ-
ект
ASCIIEncoding
(точнее, ссылку на него) всегда следует путем запроса свойства
ASCII
класса
Encoding
. Никогда не создавайте самостоятельно экземпляр класса
ASCIIEncoding
— при этом создаются дополнительные объекты в куче, что отри-
цательно сказывается на производительности.
395
Кодировки:.преобразования.между.символами.и.байтами
Вызвав для объекта, производного от
Encoding
, метод
GetBytes
, можно преоб-
разовать массив символов в массив байтов. (У этого метода есть несколько пере-
груженных версий.) Для обратного преобразования вызовите метод
GetChars
или
более удобный
GetString
. (Эти методы также имеют несколько перегруженных
версий.) Работа методов
GetBytes
и
GetString
продемонстрирована в приведенном
ранее примере.
У всех типов, производных от
Encoding
, есть метод
GetByteCount
, который, не
выполняя реального кодирования, подсчитывает количество байтов, необходимых
для кодирования данного набора символов. Он может пригодиться для выделе-
ния памяти под массив байтов. Имеется также аналогичный метод
GetCharCount
,
который возвращает число подлежащих декодированию символов, не выполняя
реального декодирования. Эти методы полезны, когда требуется сэкономить память
и многократно использовать массив.
Методы
GetByteCount
и
GetCharCount
работают не так быстро, поскольку для
получения точного результата они должны анализировать массив символов/байтов.
Если скорость важнее точности, вызывайте
GetMaxByteCount
или
GetMaxCharCount
—
оба метода принимают целое число, в котором задается число символов или байтов
соответственно, и возвращают максимально возможный размер массива.
Каждый объект, производный от
Encoding
, имеет набор открытых неизменяе-
мых свойств, дающих более подробную информацию о кодировании. Подробнее
см. описание этих свойств в документации на .NET Framework SDK.
Чтобы продемонстрировать свойства и их назначение, я написал программу,
в которой эти свойства вызываются для разных вариантов кодирования:
using System;
using System.Text;
public static class Program {
public static void Main() {
foreach (EncodingInfo ei in Encoding.GetEncodings()) {
Encoding e = ei.GetEncoding();
Console.WriteLine("{1}{0}" +
"\tCodePage={2}, WindowsCodePage={3}{0}" +
"\tWebName={4}, HeaderName={5}, BodyName={6}{0}" +
"\tIsBrowserDisplay={7}, IsBrowserSave={8}{0}" +
"\tIsMailNewsDisplay={9}, IsMailNewsSave={10}{0}",
Environment.NewLine,
e.EncodingName, e.CodePage, e.WindowsCodePage,
e.WebName, e.HeaderName, e.BodyName,
e.IsBrowserDisplay, e.IsBrowserSave,
e.IsMailNewsDisplay, e.IsMailNewsSave);
}
}
}
Вот результат работы этой программы (текст сокращен для экономии бумаги):
396
Do'stlaringiz bilan baham: |