Страница 4 из 5 Преобразование между различными кодировкамиИногда я с содроганием вспоминаю времена, когда мнеприходилось писать код с различными вариантами использования библиотек 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"); } |