Поделиться через


Использование кодировки Юникод

Обновлен: Ноябрь 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]);
   }
}
zs0350fy.alert_note(ru-ru,VS.90).gifПримечание.

При использовании данного кода в консольном приложении указанные текстовые элементы Юникода могут отображаться неправильно. Поддержка символов Юникода в консольной среде зависит от установленной версии операционной системы 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.

См. также

Основные понятия

Общие представления о кодировках

Юникод в .NET Framework