Использование кодировки Юникод
Обновлен: Ноябрь 2007
В приложениях, ориентированных на общую среду исполнения, для преобразования символов из внутреннего представления (Юникод) в другой вид используется кодирование. Для обратного преобразования знаков из внешних кодировок (не Юникод) во внутреннее представление используется декодирование. Пространство имен System.Text располагает рядом классов, позволяющих приложениям кодировать и декодировать символы. Общие сведения об этих классах см. в разделе Общие представления о кодировках.
Форматы преобразования Юникода
Стандарт Юникода присваивает каждому символу в каждом поддерживаемом сценарии кодовую позицию (номер). UTF– это формат, используемый для кодирования кодовой точки. Стандарт Юникода версии 3.2 использует форматы преобразования (UTF) и другие кодировки, перечисленные в следующей таблице. Для всех кодировок встроенные строки .NET Framework являются собственными строками UTF-16.
Кодировка Юникода UTF-32
Представляет символы Юникода в виде последовательности 32-разрядных целых чисел. Приложение может использовать класс UTF32Encoding для преобразования символов в формат кодировки UTF-32 и обратно.UTF-32 используется в случае, когда приложению необходимо избежать поведения замещающей кодовой точки UTF-16 в операционных системах, где закодированное пространство имеет большое значение. Обратите внимание, что для кодировки отдельных отображаемых "глифов" может использоваться несколько символов UTF-32. Дополнительные символы, подверженные влиянию такого поведения, встречаются реже, чем символы BMP Юникода.
Кодировка Юникода UTF-16
Представляет символы Юникода в виде последовательности 16-разрядных целых чисел. Приложение может использовать класс UnicodeEncoding для преобразования символов в формат кодировки UTF-16 и обратно.UTF-16 часто используется в виде встроенного формата, как тип Microsoft.Net char, тип Windows WCHAR и другие общие типы. Большинство распространенных кодовых точек Юникода принимают только одну кодовую точку UTF-16 (2 байта). Для дополнительных символов Юникода U+10000 и выше по-прежнему требуется две замещающие кодовые точки UTF.
Кодировка Юникода UTF-8
Представляет символы Юникод в виде последовательности длиной 8 бит. Приложение может использовать класс UTF8Encoding для преобразования символов в формат кодировки UTF-8 и обратно.UTF-8 предназначен для кодировки с помощью 8-разарядной системы и хорошо работает со многими операционными системами. Для диапазона символов ASCII UTF-8 идентичен кодировке ASCII и представляет более широкий набор символов. Однако для сценариев CJK UTF-8 может потребовать три байта для каждого символа, создавая, таким образом, данные большего размера, чем UTF-16. Обратите внимание, что иногда увеличение размера диапазона CJK объясняется объемом данных ASCII, например тегами HTML.
Кодировка Юникода UTF-7
Представляет символы Юникода в виде последовательности 7-разрядных символов ASCII. Приложение может использовать класс UTF7Encoding для преобразования символов в формат кодировки UTF-7 и обратно. Символы, отличные от ASCII Юникода, представлены в виде escape-последовательности символов ASCII.UTF-7 поддерживает определенные протоколы, для которых он необходим. Чаще всего это протоколы электронной почты и групп новостей. Однако формат UTF-7 недостаточно безопасен или надежен. В некоторых случаях изменение одного бита может привести к существенному изменению интерпретации всей строки UTF-7. В других ситуациях для кодировки одного и того же текста могут использоваться разные строки UTF-7. В последовательностях, содержащих отличные от ASCII символы, формат UTF-7 гораздо менее эффективно использует пространство, чем UTF-8, и процесс кодирования/декодирования выполняется медленнее. Следовательно, формат UTF-8 является более предпочтительным для работы в приложениях.
Кодировка ASCII
В кодировке ASCII знаки латинского алфавита кодируются как 7-разрядные символы ASCII. Так как эта кодировка поддерживает только значения символов от U+0000 до U+007F, то во многих случаях она не отвечает требованиям международных приложений. Приложение может использовать класс ASCIIEncoding для преобразования символов в формат кодировки ASII и обратно. Примеры использования этого класса в коде см. в разделе Базовые типы кодировки.Кодировки ANSI и ISO
Используются для кодировки, отличной от Юникод. Класс Encoding поддерживает широкий диапазон кодировок ANSI/ISO.
Передача двоичных данных в строки
Произвольные коллекции чисел (байт или символов) не являются допустимыми строками или коллекциями Юникода. Приложение не может преобразовать массив байтов в формат Юникода и обратно, поэтому он работать не будет. Определенные последовательности символов и кодовых позиций не поддерживаются в Юникод 5.0 и не могут быть преобразованы с помощью кодировок Юникода. Если приложение должно передать данные в двоичном формате, следует использовать базовый 64 или другой формат, предназначенный для этой цели.
Использование класса Encoding
Чтобы вернуть требуемый объект кодировки для указанной кодировки, в приложении можно использовать метод GetEncoding. Для преобразования строки Юникода в ее байтовое представление в указанной кодировке используется метод GetBytes.
Приведенный ниже пример кода использует метод GetEncoding необходимого объекта кодировки для конкретной кодовой страницы. Метод GetBytes вызывается для нужного объекта кодировки для преобразования строки Юникода в байтовое представление в требуемой кодировке. На экране будет отображено байтовое представление строки на конкретной кодовой странице.
Imports System
Imports System.IO
Imports System.Globalization
Imports System.Text
Public Class Encoding_UnicodeToCP
Public Shared Sub Main()
' Converts ASCII characters to bytes.
' Displays the string's byte representation in the
' specified code page.
' Code page 1252 represents Latin characters.
PrintCPBytes("Hello, World!", 1252)
' Code page 932 represents Japanese characters.
PrintCPBytes("Hello, World!", 932)
' Converts Japanese characters.
PrintCPBytes("\u307b,\u308b,\u305a,\u3042,\u306d",1252)
PrintCPBytes("\u307b,\u308b,\u305a,\u3042,\u306d",932)
End Sub
Public Shared Sub PrintCPBytes(str As String, codePage As Integer)
Dim targetEncoding As Encoding
Dim encodedChars() As Byte
' Gets the encoding for the specified code page.
targetEncoding = Encoding.GetEncoding(codePage)
' Gets the byte representation of the specified string.
encodedChars = targetEncoding.GetBytes(str)
' Prints the bytes.
Console.WriteLine("Byte representation of '{0}' in CP '{1}':", _
str, codePage)
Dim i As Integer
For i = 0 To encodedChars.Length - 1
Console.WriteLine("Byte {0}: {1}", i, encodedChars(i))
Next i
End Sub
End Class
using System;
using System.IO;
using System.Globalization;
using System.Text;
public class Encoding_UnicodeToCP
{
public static void Main()
{
// Converts ASCII characters to bytes.
// Displays the string's byte representation in the
// specified code page.
// Code page 1252 represents Latin characters.
PrintCPBytes("Hello, World!",1252);
// Code page 932 represents Japanese characters.
PrintCPBytes("Hello, World!",932);
// Converts Japanese characters to bytes.
PrintCPBytes("\u307b,\u308b,\u305a,\u3042,\u306d",1252);
PrintCPBytes("\u307b,\u308b,\u305a,\u3042,\u306d",932);
}
public static void PrintCPBytes(string str, int codePage)
{
Encoding targetEncoding;
byte[] encodedChars;
// Gets the encoding for the specified code page.
targetEncoding = Encoding.GetEncoding(codePage);
// Gets the byte representation of the specified string.
encodedChars = targetEncoding.GetBytes(str);
// Prints the bytes.
Console.WriteLine
("Byte representation of '{0}' in Code Page '{1}':", str,
codePage);
for (int i = 0; i < encodedChars.Length; i++)
Console.WriteLine("Byte {0}: {1}", i, encodedChars[i]);
}
}
Примечание. |
---|
При использовании данного кода в консольном приложении указанные текстовые элементы Юникода могут отображаться неправильно. Поддержка символов Юникода в консольной среде зависит от установленной версии операционной системы Windows. |
Эти методы можно использовать в приложениях ASP.NET для определения кодировки, которую надо использовать для символов ответа. В приложении следует задать значение свойства ContentEncoding значению, возвращенному соответствующим методом. В следующем примере кода показано, как задать HttpResponse.ContentEncoding.
' Explicitly sets ContentEncoding to UTF-8.
Response.ContentEncoding = Encoding.UTF8
' Sets ContentEncoding using the name of an encoding.
Response.ContentEncoding = Encoding.GetEncoding(name)
' Sets ContentEncoding using a code page number.
Response.ContentEncoding = Encoding.GetEncoding(codepageNumber)
// Explicitly sets the encoding to UTF-8.
Response.ContentEncoding = Encoding.UTF8;
// Sets ContentEncoding using the name of an encoding.
Response.ContentEncoding = Encoding.GetEncoding(name);
// Sets ContentEncoding using a code page number.
Response.ContentEncoding = Encoding.GetEncoding(codepageNumber);
Для большинства приложений ASP.NET необходимо, чтобы свойство ContentEncoding соответствовало свойству ContentEncoding для отображения текста в кодировке, нужной пользователю.
Дополнительные сведения об использовании кодировок в ASP.NET см. в примере различных кодировок в разделе Примеры решения типичных задач и в примере настройки языка и региональных параметров и кодировки в разделе Примеры использования ASP.NET.