Работа со строками в .NET - Преобразование между различными кодировками

ОГЛАВЛЕНИЕ

Преобразование между различными кодировками

Иногда я с содроганием вспоминаю времена, когда мнеприходилось писать код с различными вариантами использования библиотек MFC и ATL. По некоторым причинамстроки в объектах были однобайтовыми, а вот строковые параметры в методы COM-объектов приходили двухбайтовыми (BSTR),а еще временами использовались библиотеки на C, вкоторые строки передавались опять же в однобайтовом виде...

В .NET Framework все строки состоят только из двухбайтовых символов Unicode и это, поверьте мне, здорово. Некоторые проблемывозникают лишь тогда, когда нужно записать текст в файл или поток. По умолчанию для этого используется кодировка UTF-8. К сожалению, невсегда можно использовать только кодировку UTF-8.Случаи бывают разные – например, нужно прочитать данные из файла, записанного вкодировке Cyrillic(Windows).

Для решения подобных задач служит тип System.Text.Encoding, позволяющий осуществлять преобразования из одной кодировки в другую. Для стандартных кодировок (ASCII, BigEndianUnicode, Unicode, UTF7, UTF8) у типаEncoding есть соответствующие статические свойства. Чтобы использовать другие кодировки, требуется вызвать метод GetEncoding, передав ему либо название кодировки, либо номер кодовой страницы.

Построчное чтение текста из файла, записанного в знакомой многим русской кодировке MS-DOSможно реализовать так:

using(System.IO.StreamReader streamReader866 =

newSystem.IO.StreamReader(@"C:\Temp\Test866.txt",

System.Text.Encoding.GetEncoding(866)))

{

String singleLine;

while ((singleLine = streamReader866.ReadLine())!= null)

{

Console.WriteLine(singleLine);

}

}

Если нужно произвести перекодирование массива байт в строкуи обратно, то это можно сделать с помощью соответствующих методов типа Encoding – GetBytes и GetString.

При записи Unicode-строк стоитобратить внимание на указатель порядка байтов (byte order mark, BOM). Он используется для того,чтобы можно было узнать порядок байтов, не зная этого заранее. А управлять его присутствием можно, указав соответствующий параметр в конструкторе Encoding (или используя Encoding.Default вместо Encoding.UTF8 - в этом случае BOMиспользоваться не будет). Для записи строк в файлы (или потоки, если выразиться точнее) обычно используется тип StreamWriter. Он такжепринимает дополнительный параметр типа Encoding, чтобыобеспечить возможность записи строк в различных кодировках:

using(System.IO.StreamWriter streamWriter1252 =

newSystem.IO.StreamWriter(@"C:\Temp\Test1252.txt",

false,

System.Text.Encoding.GetEncoding("windows-1252")))

{

streamWriter1252.Write("Helloworld");

}