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: