Utilizar codificación Unicode

Las aplicaciones cuyo destino es Common Language Runtime utilizan la codificación para asignar representaciones de caracteres del esquema de caracteres nativo (Unicode) a otros esquemas.Las aplicaciones utilizan descodificación para asignar caracteres de esquemas no nativos (que no son Unicode) al esquema nativo.El espacio de nombres System.Text proporciona varias clases que permiten a las aplicaciones codificar y descodificar los caracteres.Encontrará una introducción a estas clases en Introducción a las codificaciones.

Formatos de transformación de Unicode

El estándar Unicode asigna un punto de código (un número) a cada carácter en todos los scripts admitidos.Un Formato de transformación Unicode (UTF) es un formato utilizado para codificar ese punto de código.El estándar Unicode versión 3.2 utiliza UTF y otras codificaciones definidas en la siguiente tabla.Para todas las codificaciones, las cadenas internas de .NET Framework son cadenas nativas UTF-16.Para obtener más información, vea el estándar Unicode en la página principal de Unicode.

  • Codificación UTF-32 Unicode
    Representa los caracteres Unicode como secuencias de enteros de 32 bits.La aplicación puede utilizar la clase UTF32Encoding para convertir caracteres a y desde la codificación UTF-32.

    UTF-32 se utiliza cuando las aplicaciones necesitan evitar el comportamiento de punto de código suplente de UTF-16 en los sistemas operativos para los que el espacio codificado es muy importante.Observe que los "glifos" únicos representados en una presentación aún se pueden codificar con más de un carácter UTF-32.Los caracteres suplementarios que pueden presentar este comportamiento son mucho menos habituales que los caracteres BMP Unicode.

  • Codificación UTF-16 Unicode
    Representa los caracteres Unicode como secuencias de enteros de 16 bits.La aplicación puede utilizar la clase UnicodeEncoding para convertir caracteres a y desde la codificación UTF-16.

    UTF-16 se suele utilizar de forma nativa, como en el tipo char de Microsoft.Net, el tipo WCHAR de Windows y otros tipos habituales.La mayoría de los puntos de código de Unicode comunes sólo toman un punto de código UTF-16 (2 bytes).Los caracteres Unicode suplementarios U+10000 y mayores siguen necesitando dos puntos de código UTF-16 suplentes.

  • Codificación UTF-8 Unicode
    Representa los caracteres Unicode como secuencias de bytes de 8 bits.La aplicación puede utilizar la clase UTF8Encoding para convertir caracteres a y desde la codificación UTF-8.

    UTF-8 permite codificar utilizando tamaños de datos de 8 bits y funciona bien con muchos de los sistemas operativos existentes.Para el intervalo ASCII de caracteres, UTF-8 es idéntico a la codificación ASCII y permite un conjunto mayor de caracteres.Para scripts CJK, sin embargo, UTF-8 puede necesitar tres bytes para cada carácter, lo que podría producir tamaños de datos mayores que en UTF-16.Observe que, algunas veces, la cantidad de datos ASCII, como las etiquetas HTML, justifica el aumento del tamaño para el intervalo de CJK.

  • Codificación UTF-7 Unicode
    Representa los caracteres Unicode como secuencias de caracteres ASCII de 7 bits.La aplicación puede utilizar la clase UTF7Encoding para convertir caracteres a y desde la codificación UTF-7.Los caracteres Unicode no ASCII se representan con una secuencia de escape de caracteres ASCII.

    UTF-7 admite ciertos protocolos, la mayoría protocolos de correo electrónico y de grupos de noticias.Sin embargo, la codificación UTF-7 no es particularmente segura ni sólida.En algunas situaciones, cambiar un bit puede modificar radicalmente la interpretación de una cadena UTF-7 completa.En otros casos, otras cadenas UTF-7 diferentes pueden codificar el mismo texto.Para las secuencias que incluyen caracteres no ASCII, UTF-7 es mucho menos eficaz que UTF-8 en cuanto al espacio, y la codificación y descodificación son más lentas.Por consiguiente, las aplicaciones deberían utilizar preferentemente UTF-8 en lugar de UTF-7.

  • Codificación ASCII
    Codifica el alfabeto latino como caracteres ASCII de 7 bits.Debido a que esta codificación sólo admite valores de caracteres desde U+0000 hasta U+007F, en la mayor parte de los casos no resulta adecuada para aplicaciones de uso internacional.La aplicación puede utilizar la clase ASCIIEncoding para convertir caracteres a y desde la codificación ASCII.Para obtener ejemplos de la utilización de esta clase en código, vea Codificar tipos base.

  • Codificaciones ANSI/ISO
    Se utilizan para la codificación no Unicode.La clase Encoding admite una gama amplia de codificaciones ANSI/ISO.

Pasar datos binarios en cadenas

Las colecciones aleatorias de números, ya sean bytes o caracteres, forman una cadena válida o Unicode válido.Su aplicación no puede convertir una matriz de bytes a o de Unicode y pretender que funcione.Algunos caracteres y secuencias de puntos de código no son válidos en Unicode 5.0 y no se convierten con ninguna de las codificaciones Unicode.Si su aplicación debe pasar datos binarios en un formato de cadena, debe utilizar base 64 u otro formato diseñado para ese propósito.

Utilizar la clase de codificación

La aplicación puede utilizar el método GetEncoding para devolver un objeto de codificación para una codificación determinada.La aplicación puede utilizar el método GetBytes para convertir una cadena Unicode en su representación de bytes en una codificación determinada.

En el ejemplo de código siguiente se utiliza el método GetEncoding para crear un objeto de codificación de destino para una página de códigos determinada.El objeto de codificación de destino llama al método GetBytes para convertir una cadena Unicode en su representación de bytes en la codificación de destino.Se muestran las representaciones de bytes de las cadenas de las páginas de código especificadas.

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]);
   }
}

Nota

Si utiliza este código en una aplicación de consola, los elementos de texto Unicode especificados podrían no mostrarse correctamente.La compatibilidad para los caracteres Unicode en el entorno de la consola varía, en función de la versión del sistema operativo Windows que esté utilizando.

Puede utilizar esos métodos en una aplicación de ASP.NET para determinar la codificación que se debe utilizar para los caracteres de respuesta.La aplicación debe establecer el valor de la propiedad ContentEncoding en el valor devuelto por el método correspondiente.En el siguiente ejemplo de código se muestra cómo establecer la propiedad 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);

En la mayoría de las aplicaciones ASP.NET, debe hacer coincidir el valor de la propiedad ContentEncoding con el de la propiedad ContentEncoding con el objetivo de mostrar el texto con la codificación que espera el usuario.

Para obtener más información sobre cómo utilizar codificaciones en ASP.NET, vea el ejemplo de varias codificaciones en el Tutorial rápido de tareas comunes y el ejemplo de configuración de referencia cultural y codificación en el Tutorial rápido de ASP.NET.

Vea también

Conceptos

Introducción a las codificaciones

Unicode en .NET Framework