Pergunta

Eu estou usando a classe StreamReader em .NET como esta:

using( StreamReader reader = new StreamReader( "c:\somefile.html", true ) {
    string filetext = reader.ReadToEnd();
}

Esta multa funciona quando o arquivo tem um BOM. I teve problemas com um arquivo sem BOM .. basicamente eu tenho rabiscos. Quando eu especificado Encoding.Unicode ele funcionou bem, por exemplo:

using( StreamReader reader = new StreamReader( "c:\somefile.html", Encoding.Unicode, false ) {
    string filetext = reader.ReadToEnd();
}

Então, eu preciso para obter o conteúdo do arquivo em uma string. Então como é que as pessoas geralmente lidar com isso? Eu sei que não há nenhuma solução que irá funcionar 100% do tempo, mas eu gostaria de melhorar minhas chances .. há obviamente software lá fora, que tenta adivinhar (por exemplo, bloco de notas, navegadores, etc). Existe um método no framework .NET que vai adivinhar para mim? Alguém tem algum código que gostaria de compartilhar?

Mais fundo: Este questão é praticamente a mesma que a minha, mas eu estou em .NET terra. Essa pergunta me levou a um blog listando vários codificação de detecção bibliotecas , mas nenhum deles está em .NET

Outras dicas

Você deve ler este artigo por Raymond Chen. Ele entra em detalhes sobre como os programas podem adivinhar o que uma codificação é (e um pouco da diversão que vem de adivinhar)

http://blogs.msdn.com/oldnewthing /archive/2004/03/24/95235.aspx

Eu tive sorte com Pude , uma porta C# de Mozilla Universal Charset Detector.

UTF-8 foi concebido de uma forma que é improvável ter um texto codificado em uma arbitrária-8bit codificação como ser latin1 decodificado para unicode adequada usando UTF-8.

Assim, a abordagem mínima é este (pseudocódigo, eu não falo .NET):

tentar: u = some_text.decode ( "UTF-8") exceto UnicodeDecodeError: u = some_text.decode ( "mais provável de Codificação")

Para uma mais provável que codifica geralmente utiliza, por exemplo, latin1 ou CP1252 ou qualquer outra coisa. abordagens mais sofisticadas podem tentar e encontrar pares de caracteres específicos do idioma, mas eu não estou ciente de algo que faz isso como uma biblioteca ou algo assim.

Eu usei isso para fazer algo um semelhantes tempo atrás:

http://www.conceptdevelopment.net/Localization/NCharDet/

Usar Win32 IsTextUnicode.

No sentido geral, é um promlem difícil. Veja: http://blogs.msdn.com/oldnewthing/ Arquivo / 2007/04/17 / 2158334.aspx .

Uma técnica hacky poderia ser a de fazer um MD5 do texto, em seguida, decodificar o texto e re codifica-lo em várias codificações, MD5'ing cada um. Se um jogos você acho que é esse tipo de codificação.

Isso é, obviamente, muito lento para algo que lida com um monte de arquivos, mas para algo como um editor de texto que eu poderia vê-lo trabalhando.

Além disso, vai ser mãos sujas portar as bibliotecas Java a partir de este post que veio da questão Delphi SO, ou usando o recurso IE MLang.

Veja a minha resposta (recente) para esta (tanto quanto eu posso dizer, equivalente) pergunta: Como posso detectar a codificação / página de códigos de um arquivo de texto

Ele não tenta adivinhar em toda uma gama de possíveis codificações "nacionais" como MLang e NCharDet fazer, mas assume que você sabe que tipo de arquivos não-Unicode que é provável que encontro. Tanto quanto eu posso dizer de sua pergunta, ele deve resolver o seu problema bastante confiável (sem contar com a "caixa preta" de MLang).

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