Pergunta

Eu tenho um aplicativo C # .Net que acessa dados de uma aplicação comercial apoiado por uma db Oracle 10. Um par de campos no banco de dados do aplicativo comercial (declarado como varchar2 (n)) conter caracteres especiais. A apóstrofo "quote inteligente", por exemplo. O aplicativo cliente comercial exibe esses caracteres corretamente, mas meu aplicativo está exibindo-os como um ponto de interrogação invertido. O conjunto de caracteres Oracle é "WE8ISO8859P1".

Meu aplicativo lê o banco de dados comercial utilizando System.Data.OracleClient.OracleDataAdapter, convertido em uma mesa via DataSet.Tables. Os tablerows são convertidos em objectos, e os campos em questão são armazenados como cordas.

Se eu examinar (no depurador) dos dados no DataSet imediatamente após lê-lo a partir do db, e os caracteres especiais são já exibidos incorretamente. Eu não consigo descobrir como examinar os dados como hex bytes para ver o que está realmente lá, nem estou certo que eu deveria estar procurando.

Eu também notaram que Toad exibe os caracteres como pontos de interrogação invertido também.

Um aspecto do nosso aplicativo grava esses registros para uma tabela separada no nosso próprio banco de dados; quando isso ocorre os caracteres especiais são modificados e, posteriormente, apresentar como caixas em vez de pontos de interrogação de cabeça para baixo.

eu pode fornecer informações adicionais, se necessário. Obrigado por toda e qualquer ajuda!

Foi útil?

Solução 2

Postscript para qualquer visualizando este tópico:

Bogdan foi muito útil na obtenção de me para a "resposta" (como é), mas como ele aponta, você não pode ter circunstâncias idênticas.

  1. Nós nos comunicamos com a equipe responsável por usar o software comercial. Eles haviam sido copiar / colar a partir do Word e Excel, que é como os caracteres especiais foram sendo inseridos.

  2. O problema ocorreu na tradução do caráter entre o banco de dados remoto e nosso banco de dados. banco de dados de host usa WE8ISO8859P1 conjunto de caracteres, onde a nossa usa WE8MSWIN1252. Devido a preocupações de nível corporativo, modificando qualquer conjunto de caracteres não é certo viável agora.

  3. Eu costumava SYS.UTL_RAW.CAST_TO_RAW (nome do campo) para converter o campo fonte de pesquisa para 'BF' (o código hexadecimal para um ponto de interrogação invertido em nosso conjunto de caracteres). Esta, pelo menos deixe-me identificar o registro de problema e caráter. No entanto, muitos caracteres especiais diferentes nos registros remotos iria / poderia ser traduzido para BF. Por exemplo, hífens do Word não são simples personagens "traço", e também se traduzido para o ponto de interrogação invertido.

  4. despejo (nome do campo) de alguma forma convertidos para códigos de caracteres decimal antes da tradução, a menos que eu também usei o SYS.UTL_RAW.CAST_TO_RAW na mesma consulta. Isso causou dores de cabeça surpreendentes. despejo (), por si só poderia ser útil na identificação de caracteres específicos pré-traduzidas do db fonte.

A melhor solução seria usar o mesmo conjunto de caracteres em ambos os dbs. Desde que não é possível para nós, temos substituído manualmente todas as ocorrências do caractere especial no db fonte (remoto) com equivalentes não-especiais (apóstrofe regular ou hífen). No entanto, uma vez que o software comercial não corrige ou bandeira caracteres especiais, que podem executar para esse problema no futuro. Assim, nosso aplicativo de atualização irá procurar o ponto de interrogação invertido e enviar uma notificação para o proprietário do sistema com o ID do registro ruim. Este, como tantas outras situações corporativos, terá que fazer. ; -)

Obrigado novamente, Bogdan!

Outras dicas

Alguns caracteres no conjunto de caracteres WE8ISO8859P1 tem uma representação binária diferente do que o mesmo personagem em UTF8.

O que eu sugiro 2 maneiras possíveis

1) Tente usar provedores de dados nativos Oracle para .NET (ODP.NET). Pode estar lá é um bug / recurso no System.Data.OracleClient biblioteca da Microsoft que este adaptador não suportam automaticamente converter WE8ISO8859P1 para unicode. Aqui está um link para ODP.NET

Espero que haverá um apoio para esta codificação em ODP (mas para dizer verdade, eu nunca verificado isso, é apenas uma sugestão)

2) Solução alternativa: no conjunto de dados, você deve criar um campo binário (mapeado para o campo da tabela original) e um campo String (não mapeados para o banco de dados). Quando você carregar dados para o conjunto de dados, iterate para cada linha e perfrom conversão de matriz binária para string.

Código deve ser algo como isto

Encoding e = Encoding.GetEncoding("iso-8859-1");
foreach(DataRow row in dataset.Tables["MyTable"])
{
    if (!row.IsNull("MyByteArrayField"))
        row["MyStringField"] = e.GetString((row["MyByteArrayField"] as byte[]));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top