Глава.14 .Символы,.строки.и.обработка.текста
текстовый файл, предназначенный для японской версии Windows 95, нужно сохра-
нить текст в Юникоде, используя код Shift-JIS (кодовая страница 932). Аналогично
с помощью кода Shift-JIS можно прочитать в CLR текстовый файл, созданный
в японской версии Windows 95.
Кодирование обычно выполняется перед отправкой строки в файл или сетевой
поток с помощью типов
System.IO.BinaryWriter
и
System.IO.StreamWriter
. Де-
кодирование обычно выполняется при чтении из файла или сетевого потока с по-
мощью типов
System.IO.BinaryReader
и
System.IO.StreamReader
. Если кодировка
явно не указана, все эти типы по умолчанию используют код UTF-8 (UTF означает
Unicode Transformation Format). В этом разделе операции чтения и записи строк
в потоки рассмотрены более подробно.
К счастью, в FCL есть типы, упрощающие операции кодирования и декодиро-
вания. К наиболее часто используемым кодировкам относят UTF-16 и UTF-8.
UTF-16 кодирует каждый 16-разрядный символ в 2 байта. При этом символы
остаются, как были, и сжатия данных не происходит — скорость процесса отлич-
ная. Часто код UTF-16 называют еще Юникод-кодировкой (Unicode encoding).
Заметьте также, что, используя UTF-16, можно выполнить преобразование
из прямого порядка байтов (big endian) в обратный (little endian), и наоборот.
UTF-8 кодирует некоторые символы одним байтом, другие — двумя байтами, тре-
тьи — тремя, а некоторые — четырьмя. Символы со значениями ниже 0x0080,
которые в основном используются в англоязычных странах, сжимаются в один
байт. Символы между 0x0080 и 0x07FF, хорошо подходящие для европейских
и среднеазиатских языков, преобразуются в 2 байта. Символы, начиная с 0x0800
и выше, предназначенные для языков Восточной Азии, преобразуются в 3 байта.
И наконец, пары символов-заместителей (surrogate character pairs) записыва-
ются в 4 байта. UTF-8 — весьма популярная система кодирования, однако она
уступает UTF-16, если нужно кодировать много символов со значениями от
0x0800 и выше.
Хотя для большинства случаев подходят кодировки UTF-16 и UTF-8, FCL под-
держивает и менее популярные кодировки.
UTF-32 кодирует все символы в 4 байта. Эта кодировка используется для созда-
ния простого алгоритма прохода символов, в котором не требуется разбираться
с символами, состоящими из переменного числа байтов. В частности, UTF-32
упрощает работу с символами-заместителями, так как каждый символ состоит
ровно из 4 байт. Ясно, что UTF-32 неэффективна с точки зрения экономии
памяти, поэтому она редко используется для сохранения или передачи строк
в файл или по сети, а обычно применяется внутри программ. Стоит также за-
метить, что UTF-32 можно задействовать для преобразования прямого порядка
следования байтов в обратный, и наоборот.
UTF-7 обычно используется в старых системах, где под символ отводится 7 раз-
рядов. Этой кодировки следует избегать, поскольку обычно она приводит не
393
Кодировки:.преобразования.между.символами.и.байтами
к сжатию, а к раздуванию данных. Комитет Unicode Consortium настоятельно
рекомендует отказаться от применения UTF-7.
ASCII кодирует 16-разрядные символы в ASCII-символы; то есть любой 16-
разрядный символ со значением меньше 0x0080 переводится в одиночный байт.
Символы со значением больше 0x007F не поддаются этому преобразованию, и зна-
чение символа теряется. Для строк, состоящих из символов в ASCII-диапазоне (от
0x00 до 0x7F), эта кодировка сжимает данные наполовину, причем очень быстро
(поскольку старший байт просто отбрасывается). Данный код не годится для
символов вне ASCII-диапазона, так как теряются значения символов.
Наконец, FCL позволяет кодировать 16-разрядные символы в произвольную
кодовую страницу. Как и в случае с ASCII, это преобразование может привести к по-
тере значений символов, не отображаемых в заданной кодовой странице. Исполь-
зуйте кодировки UTF-16 и UTF-8 во всех случаях, когда не имеете дело со старыми
файлами и приложениями, в которых применена какая-либо иная кодировка.
Чтобы выполнить кодирование или декодирование набора символов, сначала
надо получить экземпляр класса, производного от
System.Text.Encoding
. Аб-
страктный базовый класс
Encoding
имеет несколько статических свойств, каждое
из которых возвращает экземпляр класса, производного от
Encoding
.
Пример кодирования и декодирования символов с использованием кодировки
UTF-8:
using System;
using System.Text;
public static class Program {
public static void Main() {
// Кодируемая строка
String s = "Hi there.";
// Получаем объект, производный от Encoding, который "умеет" выполнять
// кодирование и декодирование с использованием UTF-8
Encoding encodingUTF8 = Encoding.UTF8;
// Выполняем кодирование строки в массив байтов
Byte[] encodedBytes = encodingUTF8.GetBytes(s);
// Показываем значение закодированных байтов
Console.WriteLine("Encoded bytes: " +
BitConverter.ToString(encodedBytes));
// Выполняем декодирование массива байтов обратно в строку
String decodedString = encodingUTF8.GetString(encodedBytes);
// Показываем декодированную строку
Console.WriteLine("Decoded string: " + decodedString);
}
}
394
Do'stlaringiz bilan baham: |