Como faço para determinar o conjunto de caracteres de uma string?

votos
7

Tenho vários arquivos que estão em várias línguas diferentes. Eu pensei que eles eram todos codificados em UTF-8, mas agora eu não tenho tanta certeza. Alguns personagens parecem bons, outros não. Existe uma maneira que eu posso quebrar as cordas e tentar identificar os conjuntos de caracteres? Talvez dividir espaço em branco, em seguida, identificar cada palavra? Finalmente, há uma maneira fácil de traduzir personagens de um conjunto para UTF-8?

Publicado 25/11/2008 em 23:18
fonte usuário
Em outras línguas...                            


3 respostas

votos
6

Determinar se um arquivo é provavelmente UTF-8 ou não deve ser muito fácil. Determinando a codificação se isso não é UTF-8 seria muito difícil em geral.

Se o arquivo é codificado com UTF-8, os altos bits de cada byte deve seguir um padrão. Se um personagem é um byte, seu alto bit será limpo (zero). Caso contrário, um ncarácter de bytes (onde n é 2-4) terá as altas nbits do primeiro byte definido para um, seguido por um único bit zero. Os seguintes n - 1bytes todos devem ter o conjunto bit mais alto e o segundo maior pouco apagada.

Se todos os bytes no arquivo de seguir estas regras, é provavelmente codificados com UTF-8. Digo provavelmente, porque qualquer um pode inventar uma nova codificação que acontece a seguir as mesmas regras, deliberadamente ou por acaso, mas interpreta os códigos de forma diferente.

Observe que um arquivo codificado com US-ASCII irá seguir estas regras, mas o alto bit de cada byte é zero. Está tudo bem para tratar um arquivo como UTF-8, uma vez que eles são compatíveis nesta faixa. Caso contrário, é alguma outra codificação, e não há um teste inerente de distinguir a codificação. Você terá que usar um pouco de conhecimento contextual de adivinhar.

Respondeu 25/11/2008 em 23:39
fonte usuário

votos
6

Se você não sabe o conjunto de caracteres, com certeza Você só pode adivinhar, basicamente. utf8 :: valid pode te ajudar com isso, mas você não pode realmente saber com certeza. Se você sabe que, se não for Unicode deve ser um conjunto de caracteres específico (como Latin-1), você de sorte. Se você não tem idéia, você está ferrado. Em qualquer caso, você deve sempre assumir todo o arquivo está no mesmo conjunto de caracteres, salvo indicação em contrário. Você vai perder a sua sanidade mental se não o fizer.

Quanto à sua pergunta como converter entre conjuntos de caracteres: Encode está lá para fazer isso por você

Respondeu 25/11/2008 em 23:37
fonte usuário

votos
2

Dê uma olhada em iconv

http://www.gnu.org/software/libiconv/

Text :: Iconv

Respondeu 25/11/2008 em 23:27
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more