Uso della codifica Unicode

Le applicazioni progettate per Common Language Runtime utilizzano la codifica per eseguire il mapping tra le rappresentazioni di caratteri dallo schema dei caratteri nativo (Unicode) e gli altri schemi.Le applicazioni utilizzano la decodifica per eseguire il mapping dei caratteri dagli schemi non nativi (non Unicode) allo schema nativo.Lo spazio dei nomi System.Text fornisce un certo numero di classi che consentono la codifica e decodifica dei caratteri da parte delle applicazioni.Per un'introduzione a queste classi, vedere Informazioni sulle codifiche.

Formati di trasformazione Unicode

Secondo lo standard Unicode viene assegnato un punto di codice (un numero) a ciascun carattere in ogni script supportato.Il formato UTF (Unicode Transformation Format) consente di codificare tale punto di codice.Nello standard Unicode versione 3.2 vengono utilizzati i formati UTF e altre codifiche definite nella tabella riportata di seguito.Per tutte le codifiche, le stringhe .NET Framework interne sono stringhe UTF-16 native.Per ulteriori informazioni sullo standard Unicode, vedere la home page dello standard Unicode (la pagina potrebbe essere in inglese).

  • Codifica Unicode UTF-32
    Rappresenta i caratteri Unicode come sequenze di numeri interi a 32 bit.L'applicazione può utilizzare la classe UTF32Encoding per convertire i caratteri nella codifica UTF-32 ed eseguire l'operazione inversa.

    La codifica UTF-32 viene utilizzato quando è necessario evitare il comportamento del punto di codice surrogato del formato UTF-16 su sistemi operativi per i quali lo spazio codificato è estremamente importante.Si noti che i soli "glifi" di cui viene eseguito il rendering su uno schermo possono comunque essere codificati con più di un carattere UTF-32.I caratteri supplementari vulnerabili a questo comportamento sono attualmente molto più rari dei caratteri Unicode BMP.

  • Codifica Unicode UTF-16
    Rappresenta i caratteri Unicode come una sequenza di numeri interi a 16 bit.L'applicazione può utilizzare la classe UnicodeEncoding per convertire i caratteri nella codifica UTF-16 ed eseguire l'operazione inversa.

    La codifica UTF-16 viene spesso utilizzata a livello nativo, come avviene nel tipo char di Microsoft.Net, nel tipo WCHAR di Windows e in altri tipi comuni.I punti di codice Unicode più comuni occupano un solo punto di codice UTF-16 (2 byte).I caratteri Unicode supplementari a partire da U+10000 necessitano ancora di due punti di codice surrogati UTF-16.

  • Codifica Unicode UTF-8
    Rappresenta i caratteri Unicode come una sequenza di byte a 8 bit.L'applicazione può utilizzare la classe UTF8Encoding per convertire i caratteri nella codifica UTF-8 ed eseguire l'operazione inversa.

    Il formato UTF-8 consente di eseguire la codifica utilizzando dimensioni dei dati a 8 bit ed è compatibile con molti sistemi operativi esistenti.Per l'intervallo di caratteri ASCII, la codifica UTF-8 è identica alla codifica ASCII e consente di utilizzare un set di caratteri più ampio.Per gli script CJK, tuttavia, la codifica UTF-8 può richiedere anche tre byte per ciascun carattere, dando luogo a dimensioni dei dati potenzialmente maggiori rispetto alla codifica UTF-16.Si noti che talvolta la quantità di dati ASCII, ad esempio i tag HTML, giustifica l'aumento delle dimensioni dell'intervallo CJK.

  • Codifica Unicode UTF-7
    Rappresenta i caratteri Unicode come una sequenza di caratteri ASCII a 7 bit.L'applicazione può utilizzare la classe UTF7Encoding per convertire i caratteri nella codifica UTF-7 ed eseguire l'operazione inversa.I caratteri Unicode non ASCII sono rappresentati da una sequenza di escape di caratteri ASCII.

    UTF-7 supporta determinati protocolli, in genere protocolli di posta elettronica e newsgroup.La codifica UTF-7 non è tuttavia particolarmente sicura o affidabile.In alcune situazioni il cambiamento di un bit può alterare radicalmente l'interpretazione di un'intera stringa UTF-7.In altre situazioni, stringhe UTF-7 diverse possono codificare lo stesso testo.Per le sequenze in cui sono inclusi caratteri non ASCII, il formato UTF-7 richiede molto più spazio rispetto a UTF-8 e le operazioni di codifica e decodifica sono più lente.In generale, le applicazioni dovrebbero quindi utilizzare di preferenza la codifica UTF-8 anziché la codifica UTF-7.

  • Codifica ASCII
    Codifica l'alfabeto latino come singoli caratteri ASCII a 7 bit.Poiché vengono supportati solo i valori di caratteri compresi tra U+0000 e U+007F, nella maggior parte dei casi questa codifica non è adatta alle applicazioni internazionali.L'applicazione può utilizzare la classe ASCIIEncoding per convertire i caratteri nella codifica ASCII ed eseguire l'operazione inversa.Per alcuni esempi sull'uso della classe nel codice, vedere Codifica dei tipi di base.

  • Codifiche ANSI/ISO
    Utilizzate per la codifica non Unicode.La classe Encoding supporta un'ampia gamma di codifiche ANSI/ISO.

Passaggio di dati binari alle stringhe

Insiemi casuali di numeri, byte o caratteri non costituiscono una stringa valida o una sequenza Unicode valida.Una matrice di byte convertita in Unicode o viceversa da un'applicazione non è utilizzabile.Alcuni caratteri e sequenze di punti di codice non sono consentiti in Unicode 5.0 e non possono essere convertiti in nessuna codifica Unicode.Per effettuare il passaggio di dati binari a un formato stringa, l'applicazione deve utilizzare il formato base 64 o un altro formato creato appositamente a tale scopo.

Uso della classe Encoding

Il metodo GetEncoding può essere utilizzato dall'applicazione per restituire un oggetto di codifica per una codifica specificata.Il metodo GetBytes può essere utilizzato dall'applicazione per convertire una stringa Unicode nella relativa rappresentazione in byte in una codifica specificata.

Nell'esempio di codice riportato di seguito viene utilizzato il metodo GetEncoding per creare un oggetto di codifica di destinazione per una tabella codici specificata.Il metodo GetBytes viene chiamato sull'oggetto di codifica di destinazione per convertire una stringa Unicode nella relativa rappresentazione in byte nella codifica di destinazione.Vengono visualizzate le rappresentazioni in byte delle stringhe nelle tabelle codici specificate.

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

Se questo codice viene utilizzato in un'applicazione console, è possibile che gli elementi di testo Unicode specificati non vengano visualizzati correttamente.Il supporto dei caratteri Unicode in ambiente console varia in base alla versione del sistema operativo Windows in esecuzione.

È possibile utilizzare questi metodi in un'applicazione ASP.NET per determinare la codifica da utilizzare per i caratteri di risposta.Il valore della proprietà ContentEncoding deve essere impostato dall'applicazione sul valore restituito dal metodo appropriato.Nell'esempio di codice riportato di seguito viene illustrato come impostare l'oggetto 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);

Nella maggior parte delle applicazioni ASP.NET, perché il testo venga visualizzato nella codifica prevista dall'utente la proprietà ContentEncoding deve corrispondere alla proprietà ContentEncoding.

Per ulteriori informazioni sull'uso di codifiche in ASP.NET, vedere gli esempi di codifiche multiple in Guide rapide sulle attività comuni e l'esempio di definizione delle impostazioni cultura e di impostazione della codifica in Guida rapida ad ASP.NET.

Vedere anche

Concetti

Informazioni sulle codifiche

Unicode in .NET Framework