C# - Codificando uma string usando codificação de caracteres alternativo

 

Neste artigo vou mostrar como você pode trocar dados com sistemas que usam outros esquemas de codificação de caracteres UTF-16.(que é o esquema internamente usado pela CLR)

O Unicode não é o único esquema de codificação de caracteres, nem é a UTF-16 é a única maneira de representar caracteres Unicode.

Se você precisa trocar dados de caracteres com sistemas externos (em geral sistemas legados) através de uma matriz de bytes, pode ser necessário converter dados de caracteres entre UTF-16 e o esquema de codificação suportado pelo outro sistema.

A classe abstrata Encoding e suas subclasses concretas fornecem a funcionalidade de converter caracteres para uma variedade de esquemas de codificação. Cada instância de subclasse suporta a conversão de caracteres entre UTF-16 e um outro esquema de codificação.

Você pode obter instâncias das classes codificação específica usando o método static factory Encoding.GetEncoding, que aceita o nome ou o número da página de código do esquema de codificação necessária.

A tabela abaixo lista alguns esquemas de codificação de caracteres comumente utilizados e o número da página de código que você deve passar para o método GetEncoding para criar uma instância da classe de codificação apropriada.
(Ela também mostra algumas propriedades estáticas da classe Encoding que fornecem atalhos para obter a maioria tipos de objetos de codificação utilizada.)

Esquema Encoding Classe Utilização
ASCII ASCIIEnconding GetEnconding(20127) ou propriedade ASCII
Default Enconding GetEnconding(0) ou propriedade Default
UTF-7 UTF7Enconding GetEnconding(65000) ou propriedade UTF7
UTF-8 UTF8Enconding GetEnconding(65001) ou propriedade UTF8
UTF-16 UnicodeEnconding GetEnconding(1201) ou propriedade BigEndianUnicode
UTF-16 (little-endian) UnicodeEnconding GetEnconding(1200) ou propriedade Unicode
Windows OS Enconding GetEnconding(1252)

Nota: Para mais detalhes veja o link: https://msdn.microsoft.com/pt-br/library/system.text.encoding(v=vs.110).aspx

Uma vez que você tenha um objeto de codificação do tipo apropriado, você converte uma string Unicode codificada UTF-16 para um array de bytes de caracteres codificados usando o método GetBytes. A contrapartida é converter um array de byte de caracteres codificados em uma string usando o método GetString.

Vamos então mostrar um exemplo para clarear o entendimento. (Este é um artigo para iniciantes da linguagem C#.)

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando o projeto no VS Community

Abra o VS Community 2015 e clique em New Project;

Selecione a linguagem Visual C# e o template Console Application;

Informe o nome C_Encoding e clique no botão OK;

A seguir inclua o código abaixo no arquivo Program.cs:

using System;
using System.IO;
using System.Text;
namespace C_Encoding
{
    class Program
    {
        static void Main(string[] args)
        {
            // Cria um arquivo para tratar a saída (na pasta bin\Debug)
            using (StreamWriter saida = new StreamWriter("resultado.txt"))
            {
                // Cria e escreve uma string contendo o símbolo para PI.
                string stringFonte = "Area = \u03A0r^2";
                saida.WriteLine("Texto Fonte : " + stringFonte);
                // Escreve os bytes codificados UTF-16 para string fonte
                byte[] utf16String = Encoding.Unicode.GetBytes(stringFonte);
                saida.WriteLine("Bytes UTF-16: {0}",
                BitConverter.ToString(utf16String));
                // Converte a string fonte codificada UTF-16 para UTF-8 e ASCII.
                byte[] utf8String = Encoding.UTF8.GetBytes(stringFonte);
                byte[] asciiString = Encoding.ASCII.GetBytes(stringFonte);
                // Escreve o array de bytes da codificacao UTF-8 e ASCII.
                saida.WriteLine("Bytes UTF-8 : {0}",
                BitConverter.ToString(utf8String));
                saida.WriteLine("Bytes ASCII : {0}",
                BitConverter.ToString(asciiString));
                // Converte os bytes codificados UTF-8 e ASCII de volta para a codificação string UTF-16 e escreve
                saida.WriteLine("Texto UTF-8  : {0}",
                Encoding.UTF8.GetString(utf8String));
                saida.WriteLine("Texto  ASCII : {0}",
                Encoding.ASCII.GetString(asciiString));
            }
            // Aguarda para continuar
            Console.WriteLine("\nOperação concluída. Pressione Enter");
            Console.ReadLine();
        }
    }
}

Executando o projeto acima e a seguir abrindo o arquivo Resultado.txt que será gerado na pasta bin\Debug temos o seguinte resultado:

Resultado.txt:

Texto Fonte : Area = Πr^2
Bytes UTF-16: 41-00-72-00-65-00-61-00-20-00-3D-00-20-00-A0-03-72-00-5E-00-32-00
Bytes UTF-8 : 41-72-65-61-20-3D-20-CE-A0-72-5E-32
Bytes ASCII :  41-72-65-61-20-3D-20-3F-72-5E-32
Texto UTF-8  : Area = Πr^2
Texto  ASCII : Area = ?r^2

Note que usando a codificação UTF-16, cada caractere ocupa 2 bytes, mas como a maior parte dos caracteres são caracteres padrão, o byte de alta ordem é 0. (O uso de ordenação de bytes little-endian significa que o byte de ordem aparece em primeiro lugar.)

Isto significa que a maioria dos caracteres são codificados usando os mesmos valores numéricos em todos os três esquemas de codificação.

No entanto, o valor numérico do símbolo PI é diferente em cada uma das codificações. O valor do PI requer mais do que 1 byte para se representar. 

A UTF-8 utiliza 2 bytes, mas a ASCII não tem equivalente direto e assim substitui PI com o código 3F. Como você pode ver na versão de texto ASCII da string, 3F é o símbolo para um ponto de interrogação (?).

Pegue o projeto completo aqui:   C_Encoding.zip

Porque a palavra da cruz é loucura para os que perecem; mas para nós, que somos salvos, é o poder de Deus.
Porque está escrito: Destruirei a sabedoria dos sábios, E aniquilarei a inteligência dos inteligentes.

1 Coríntios 1:18,19
 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti