Questão Windows 7 UTF-8 e Unicode


Alguém poderia explicar o que mudou no Windows 7 (Pro 64-bit)?

Detalhes: Anteriormente, eu tinha o Windows XP e tinha alguns arquivos de tradução (codificados em UTF-8) no formato CSV. Consegui visualizar as fontes no Bloco de Notas e no Excel. Depois de atualizar para o Windows 7, quando eu abro esses arquivos - tudo o que vejo são caixas quadradas (só você sabe, se eu abri-las no navegador - eu era capaz de ver toda a tradução). Se eu salvar esses arquivos em Unicode, tudo parece estar bem.

Então, o que exatamente está acontecendo? Por que o Windows 7 funciona com o Unicode e não com o UTF-8?


13


origem




Respostas:


Por que o Windows 7 funciona com o Unicode e não com o UTF-8?

Terminologia

Unicode e UTF-8 não são o mesmo tipo de coisa: Unicode é um conjunto de caracteres que define um conjunto de caracteres (um repertório) e atribui números (pontos de código) a cada um desses caracteres. O UTF-8 é um dos vários codificações que pode ser usado para represente um fluxo de caracteres Unicode no disco ou na transmissão. O mesmo fluxo de caracteres Unicode também pode ser codificado como UTF-16, UTF-32 ou UTF-7, por exemplo.

No entanto, o Notepad oferece opções de "codificação", incluindo ANSI, Unicode, Unicode big-endian e UTF-8. Os desenvolvedores da Microsoft que escreveram isso usaram os termos errados. Quando eles dizem "Unicode" eles provavelmente significam "UTF-16 pequeno endian"Quando eles dizem" ANSI "eles significam Página de código 1252 (CP-1252)

Bloco de Notas da Microsoft

Eu acredito que o Bloco de Notas da Microsoft escreve UTF-16 com uma marca de ordem de byte (BOM) e que o Bloco de Notas procura a BOM ao ler um arquivo de texto. A BOM informa ao aplicativo que o arquivo é UTF-16 e indica se ele é big-endian ou little-endian.

Se o Notepad não encontrar o BOM, ele chamará uma função de biblioteca IsTextUnicode, que analisa os dados e tenta adivinhar qual codificação foi usada. Às vezes (inevitavelmente) adivinha incorretamente. Às vezes, adivinha-se que um arquivo "ANSI" é "Unicode". Tentando interpretar um arquivo UTF-16 ou UTF-8 como Página de Código 1252 faria com que ele exibisse os glifos errados e não conseguisse encontrar glifos para renderizar alguns valores de 8 bits - estes seriam então mostrados como quadrados.

Como harrymc diz em sua resposta, existem alternativas melhores para o Bloco de Notas. Mas o Bloco de Notas permite que você escolha explicitamente a codificação ao abrir um arquivo (em vez de deixar o Bloco de Notas para tentar adivinhar).

Marcas de ordem de byte

De acordo com o consórcio Unicode, as marcas de ordem de bytes (BOMs) são opcionais. No entanto, o Windows depende de BOMs para distinguir entre algumas codificações.

Então, em suma, talvez seus arquivos não tivessem uma lista de materiais por algum motivo? Talvez a lista de materiais tenha sido perdida em algum momento durante o processo de atualização?

Se você ainda tiver os arquivos originais mostrados como quadrados, você poderá fazer um dump hexadecimal deles para ver se eles contêm uma BOM.


Padrões de arquivos de texto simples

O problema é que existem efetivamente Nenhum - sem padrões universais para arquivos de texto simples. Em vez disso, temos um número de incompatibilidades e incógnitas.

  • Como os fins de linha foram marcados? Algumas plataformas usam os caracteres de controle Carriage Return (CR), seguido por Line Feed (LF), alguns usam somente CR e alguns usam apenas LF.

  • Os terminadores ou separadores acima são? Isso tem um efeito no final de um arquivo e é conhecido por causar problemas.

  • Tratamento de abas e outros caracteres de controle. Podemos supor que uma guia é usada para alinhar um múltiplo de 8 larguras de caractere padrão desde o início da linha, mas realmente não há certeza disso. Muitos programas permitem que as posições das guias sejam alteradas.

  • Conjunto de caracteres e codificação? Não há um padrão universal para indicar quais desses foram usados ​​para o texto no arquivo. O mais próximo que temos é procurar a presença de um BOM que indique que a codificação é uma daquelas usadas para Unicode. A partir do valor de BOM, o programa que lê o arquivo pode distinguir entre UTF-8 e UTF-16, etc., e entre variantes Little-Endian e Big-Endian de UTF-16, etc. Não existe um padrão universal para indicar que um arquivo é codificado em qualquer outra codificação popular, como CP-1252 ou KOI-8.

E assim por diante. Nenhum dos metadados acima está escrito no arquivo de texto - portanto, o usuário final deve informar o programa ao ler o arquivo. O usuário final precisa conhecer os valores de metadados para qualquer arquivo específico ou correr o risco de que seu programa use os valores errados de metadados.

Bush escondeu os fatos

Tente isso no Windows XP.

  • Abra o Bloco de Notas.
  • Defina a fonte para Arial Unicode MS. (Você pode precisar instalá-lo primeiro; Se você não vê-lo no menu, clique em "Mostrar mais fontes".
  • Digite o texto "Bush escondeu os fatos".
  • Escolher Save As. De Encoding menu, selecione ANSI.
  • Feche o bloco de notas.
  • Reabra o documento (por exemplo, usando Start, My Recent Documents).
  • Você verá 畂 桳 栠 摩 琠 敨 映 捡 獴 em vez de "Bush escondeu os fatos".

Isso ilustra que o IsTextUnicode função usada pelo bloco de notas incorretamente adivinha que o texto ANSI (realmente CodePage 1252) é Unicode UTF-16LE sem um BOM. Não há lista de materiais em um arquivo salvo como ANSI.

Windows 7

Com o Windows 7, a Microsoft ajustou IsTextUnicode para que o acima não aconteça. Na ausência de uma BOM, agora é mais provável adivinhar ANSI (CP 1252) do que Unicode (UTF-16LE). Com o Windows-7 eu espero que você esteja, portanto, Mais provável ter o problema inverso: um arquivo contendo caracteres Unicode com pontos de código maiores que 255, mas sem BOM, agora é mais provável de ser adivinhado como sendo ANSI - e, portanto, exibido incorretamente.

Evitando problemas de codificação

Atualmente, a melhor abordagem parece ser usar o UTF-8 em todos os lugares. Idealmente, você deve recodificar todos os arquivos de texto antigos em UTF-8 e salvar apenas arquivos de texto como UTF-8. Existem ferramentas como recodificar e iconv que pode ajudar com isso.


29



De acordo para a Wikipedia: no Windows Vista e no Windows 7 [..] O IsTextUnicode foi alterado para aumentar a probabilidade de adivinhar uma codificação baseada em bytes em vez de UTF-16LE. - Arjan
Sim, com certeza nós esses arquivos temos BOM já que geramos esses arquivos com BOM. É interessante que o Windows 7 não leia o BOM criado pelo sistema operacional mais antigo. - Sha Le
BOM não mudou. Pode ser que seus arquivos não tenham a lista de materiais, mas que anteriormente o formato padrão era alguma variante Unicode, onde agora é ASCII. Veja minha resposta. - harrymc
@Sha Le: Se o arquivo tiver uma lista de materiais, o Bloco de notas do Windows 7 deve abri-lo corretamente. Portanto, o problema que você descreve não se encaixa nos problemas conhecidos. isTextUnicode. Você pode criar um pequeno arquivo de amostra que ilustra o problema que você tem com um arquivo que inclui uma lista de materiais? - RedGrittyBrick
Há também this app can break para o mesmo efeito que Bush hid the facts - Regent


Uma observação: você pode usar Notepad ++ para visualizar esses arquivos, usando o menu Codificação.

Quando os arquivos forem exibidos corretamente, salvá-los adicionará a lista de materiais correta.


3



Eu sei que este post é um pouco antigo, mas atualmente eu tenho problema com o win 7 e notepad ++ não exibindo UTF 8 sem BOM quando os arquivos foram criados inicialmente usando o próprio notepad ++ v5.9.6.2. - Jake
@Jake: Certifique-se de que o menu Codificação mostre "Codificar em UTF8", em vez de "Codificar em UTF8 sem BOM". - harrymc