Questão sobre codificações: Como posso saída do HtmlAgilityPack a um StringWriter e manter a codificação?

StackOverflow https://stackoverflow.com/questions/1115718

Pergunta

Estou lendo html com HtmlAgilityPack, editá-lo, então a saída para um StreamWriter. O HtmlAgilityPack codificação é Latin1, eo StreamWriter é UnicdeEncoding.

Estou perdendo alguns caracteres na conversão, e eu não quero ser.

Eu não parecem ser capazes de alterar a codificação de um StreamWriter. Qual é a melhor contornar este problema?

Foi útil?

Solução

Se a página web é realmente Latin-1 (ISO-8859-1), pode não tem nenhum aspas curvas nele; Latin-1 não tem mapeamentos para esses caracteres. Se você pode ver aspas curvas quando você abrir a página no navegador, eles poderiam ser na forma de entidades HTML (“ e ” ou “ e ”). Mas eu suspeito que a codificação do página é realmente windows-1252, apesar do que os cabeçalhos e declarações incorporados dizer.

windows-1252 é idêntico ao Latin-1, exceto que ele substitui os caracteres de controle na faixa \x80..\x9F (128..159 decimal) com personagens mais úteis (ou pelo menos mais bonita) impressão. Se HtmlAgilityPack está tomando a página em sua palavra e decodificá-la como ISO-8859-1, ele irá converter \x93 ao \u0093 carácter de controlo, que vai olhar como lixo se você pode obtê-lo para mostrar a todos. O navegador, por sua vez, irá convertê-lo para \u201C, o ponto de código Unicode para a Esquerda aspas duplas.

Eu não estou familiarizado com HtmlAgilityPack e eu não posso encontrar qualquer docs para isso, mas gostaria de tentar forçá-lo a usar o Windows-1252. Por exemplo, você poderia criar um-1252 windows (ou "ANSI") StreamReader e ter HAP uso isso.

Outras dicas

Em uma suposição; escrever para um Stream (não um string). Se você escrever para um string (inc. StringWriter / StringBuilder, você está usando implicitamente corda do .NET UTF-16.

Se você quer apenas ajustar o relatou codificação (mas usar um string), em seguida olhar para Jon responder aqui .

Não é claro que acabam você está perdendo caracteres no. Em qualquer caso, uma mera incompatibilidade de codificação não é por si só um problema - você ainda está supostamente para obter os caracteres corretos. Se um Unicode StreamWriter escreve caracteres truncados, isso significa que ele tinha recebido de lixo na entrada em primeiro lugar. O que provavelmente significa que HtmlAgilityPack tem codificar para sua página errada. Se ele tem uma opção de definir a codificação manualmente, você pode querer fazer isso.

Também pode ser que você tenha uma página HTML que tem uma declaração de codificação de errado nisso. Por exemplo. que poderia ser um arquivo UTF-8 que contém elemento <meta> declará-la como Latin-1. De onde você tira o texto? Você baixá-lo diretamente da Web, ou você tê-lo em um arquivo de texto - e se ele é o último, como você criar esse arquivo? Se você fez isso manualmente através de bloco de notas, ou no código via StreamWriter, então você pode ter um arquivo UTF-8.

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