Работа со строками в .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");
}