Pergunta

O aplicativo existente passa XML para um SPROC no SQLSERVER 2000, o tipo de dados do parâmetro de entrada é o texto; O XML é derivado do DataSet.getxml (). Mas percebo que não especifica uma codificação.

Portanto, quando o usuário se esgueirar em um caractere inadequado no conjunto de dados, especificamente ASCII 146 (que parece ser um apóstrofo) em vez do ASCII 39 (citação única), o SPROC falha.

Uma abordagem é prefixar o resultado de getxml com

<?xml version="1.0" encoding="ISO-8859-1"?>

Funciona neste caso, mas qual seria uma abordagem mais correta para garantir que o SPROC não trave (se outros personagens imprevistos aparecerem)?

Ps. Suspeito que o usuário esteja digitando texto no ms-word ou editor similar e copiar e colar nos campos de entrada do aplicativo; Eu provavelmente gostaria de permitir que o usuário continuasse funcionando dessa maneira, só precisa evitar as falhas.

EDIT: Estou procurando respostas que confirmem ou negem alguns aspectos, por exemplo:
- Conforme título, qual é a codificação padrão se nenhum especificado no XML?
-A codificação ISO-8859-1 é a certa para usar?
- se houver uma codificação melhor que abrangeria mais caracteres no mundo de língua inglesa e, portanto, menos propenso a causar um erro no SPROC?
- Você filtrava no nível da interface do usuário do aplicativo para ASCII padrão (apenas 0 a 127) e não permitia o ASCII estendido?
- Quaisquer outros detalhes pertinentes.

Foi útil?

Solução

DataSet.GetXml() retorna a string. No .NET, as cordas são codificadas internamente usando o UTF-16, mas isso não é realmente relevante aqui.

A razão pela qual não há <?xml encoding=...> A declaração na string é porque essa declaração é apenas útil ou necessária para analisar XML em um fluxo de bytes. Uma string .NET não é um fluxo de bytes, é apenas um texto com semântica bem definida do CodePoint (que é unicode), portanto não é necessário lá.

Se não houver declaração de codificação XML, o UTF-8 deve ser assumido pelo analisador XML Na ausência de Bom. No seu caso, no entanto, também é totalmente irrelevante, pois o problema não está com um analisador XML (o XML não é analisado pelo SQL Server quando é armazenado em um TEXT coluna). O problema é que o seu XML contém alguns caracteres unicode e TEXT é um tipo SQL não unicode.

Você pode codificar um string para qualquer codificação usando Encoding.GetBytes() método.

Outras dicas

Acredito que sua abordagem deve ser usar o writexml em vez do getXML. Isso deve permitir que você especifique a codificação.

No entanto, observe que você terá que escrever através de um fluxo intermediário - se você gerar diretamente para uma string, ela sempre usará o UTF -16. Como você está usando uma coluna de texto, isso permitirá que os caracteres não sejam válidos para o texto.

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