Pergunta

Aqui está o problema:

Em C # Eu estou recebendo informações de um banco de dados legado ACCESS. .NET converte o conteúdo do banco de dados (no caso de este problema de uma string) para Unicode antes de entregar o conteúdo para mim.

Como faço para converter essa string volta Unicode a ele do ASCII equivalente?


Editar
Unicode caractere 710 é, de facto MODIFICADOR LETRA acento circunflexo. Aqui está o problema um pouco mais preciso:

 -> (Extended) ASCII character ê (Extended ASCII 136) was inserted in the database.
 -> Either Access or the reading component in .NET converted this to U+02C6 U+0065
    (MODIFIER LETTER CIRCUMFLEX ACCENT + LATIN SMALL LETTER E)
 -> I need the (Extended) ASCII character 136 back.


Aqui está o que eu tentei (eu vejo agora por que isso não funcionou ...):

string myInput = Convert.ToString(Convert.ToChar(710));
byte[] asBytes = Encoding.ASCII.GetBytes(myInput);

Mas isso não resulta em 94, mas um byte com o valor 63 ...
Aqui está uma nova tentativa, mas ele ainda não funciona:

byte[] bytes = Encoding.ASCII.GetBytes("ê");


Soltution
Graças a ambos csgero e bzlm para apontar na direção certa eu resolvi o problema aqui .

Foi útil?

Solução

Ok, vamos elaborar. Ambos csgero e < a href = "https://stackoverflow.com/questions/138449/how-to-convert-a-unicode-character-to-its-extended-ascii-equivalent#138583"> bzlm apontado na direita direção.

Por causa da blzm responder Olhei para cima a página do Windows-1252 em wiki e descobriu que ele é chamado de uma página de código. O artigo da Wikipedia para Código página que declarou o seguinte:

No padrão formal existia para esses ‘ conjuntos de caracteres estendidos ’; IBM apenas se referiu à variantes como páginas de código, como sempre tinha feito para as variantes de codificações EBCDIC.

Isso me levou a página de código 437:

n páginas de código ASCII-compatível, inferiores 128 caracteres mantiveram as suas US-ASCII valores standard, e páginas diferentes (ou conjuntos de caracteres) poderia ser disponibilizado nos superiores 128 caracteres. computadores DOS construídos para o mercado norte-americano, por exemplo, usou código da página 437 , que incluiu acentuado caracteres necessários para francês, alemão, e algumas outras línguas europeias, bem como alguns caracteres de desenho de linha gráfica.

Assim, página de código 437 foi o codepage eu estava chamando 'ASCII estendido', que tinha o ê como o personagem 136 então eu olhei para alguns outros caracteres bem e eles parecem bem.

csgero veio com a sugestão Encoding.GetEncoding (), eu usei-o para criar a seguinte declaração que resolve meu problema:

byte[] bytes = Encoding.GetEncoding(437).GetBytes("ê");

Outras dicas

Você não pode usar a codificação ASCII padrão (Encoding.ASCII) aqui, mas deve criar a codificação com a página de código apropriado usando Encoding.GetEncoding (...). Você pode tentar usar página de código 1252, que é um super conjunto de ISO 8859-1.

ASCII não define ê; o número 136 vem do número para o circunflexo em codificações de 8 bits, tais como Windows-1252.

Você pode verificar se um pequeno e com um circunflexo (E) é realmente o que é suposto ser armazenado no banco de dados Access, neste caso? Talvez U + 02C6 U + 0065 é o resultado de um erro de conversão, onde a entrada é realmente um e seguido de um circunflexo, ou algo completamente diferente. Talvez o seu banco de dados Access tem dados corrompidos no sentido de que a codificação designado não coincide com o conteúdo, caso em que o cliente .NET pode incorretamente analisar os dados (usando o decodificador errado).

Se este erro é de fato introduzido durante a leitura do banco de dados, talvez colando algumas configurações de código ou de configuração podem ajudar.

Na página de código 437 , número de caracteres 136 é um e com um acento circunflexo.

Hmm ... Eu não tenho certeza qual personagem você quer dizer. O acento circunflexo ( “^”, acento circunflexo) tem o mesmo código ASCII e Unicode (U + 005E).

/ EDIT: Damn, é minha culpa. 710 (L + 02C6) é, na verdade, o modificador LETRA acento circunflexo. Infelizmente, este personagem não faz parte do ASCII em tudo. Pode parecer o cursor normal, mas é um personagem diferente. conversão simples não vai ajudar aqui. Eu não tenho certeza se o .NET suporta mapeamento de caracteres semelhantes ao converter de Unicode. Vale a pena investigar, no entanto.

O valor 63 é o ponto de interrogação, AKA "Eu não sou capaz de exibir este personagem em ASCII".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top