Windows 7 UTF-8 et Unicode

14

Quelqu'un pourrait-il expliquer ce qui a changé dans Windows 7 (Pro 64 bits)?

Détails: Auparavant, j'avais Windows XP et j'avais des fichiers de traductions (encodés en UTF-8) au format CSV. J'ai pu voir les polices dans le Bloc-notes et Excel. Après la mise à niveau vers Windows 7, lorsque j'ouvre ces fichiers - tout ce que je vois, ce sont des cases carrées (juste vous savez, si je les ouvre dans le navigateur - j'ai pu voir toute la traduction). Si j'enregistre ces fichiers en Unicode, tout semble aller bien.

Alors, que se passe-t-il exactement? Pourquoi Windows 7 fonctionne-t-il avec Unicode et non avec UTF-8?

Sha Le
la source

Réponses:

30

Pourquoi Windows 7 fonctionne-t-il avec Unicode et non avec UTF-8?

Terminologie

Unicode et UTF-8 ne sont pas le même genre de chose: Unicode est un jeu de caractères qui définit un ensemble de caractères (un répertoire) et attribue des numéros (points de code) à chacun de ces caractères. UTF ‑ 8 est l'un des nombreux encodages pouvant être utilisés pour représenter un flux de caractères Unicode sur disque ou en transmission. Le même flux de caractères Unicode pourrait également être codé en UTF-16, UTF-32 ou UTF-7, par exemple.

Cependant, vous offre des options Bloc - notes « encodage » y compris ANSI, Unicode, Unicode big-endianet UTF-8. Les développeurs Microsoft qui ont écrit cela ont utilisé les mauvais termes. Quand ils disent "Unicode", ils signifient très probablement " UTF-16 little-endian ". Quand ils disent «ANSI», ils font référence à la page de code 1252 (CP-1252).

Bloc-notes Microsoft

Je crois que le bloc-notes de Microsoft écrit UTF-16 avec une marque d'ordre d'octets ( BOM ) et que le bloc-notes recherche la nomenclature lors de la lecture d'un fichier texte. La nomenclature indique à l'application que le fichier est UTF-16 et indique s'il s'agit d'un big-endian ou d'un petit-endian.

Si le Bloc-notes ne trouve pas la nomenclature, il appelle une fonction de bibliothèque IsTextUnicode, qui examine les données et tente de deviner quel encodage a été utilisé. Parfois (inévitablement), il devine incorrectement. Parfois, il suppose qu'un fichier "ANSI" est "Unicode". Essayer d'interpréter un fichier UTF-16 ou UTF-8 comme la page de codes 1252 entraînerait l'affichage de glyphes incorrects et l'incapacité de trouver des glyphes pour restituer des valeurs 8 bits - celles-ci seraient alors affichées sous forme de carrés.

Comme le dit Harryryc dans sa réponse , il existe de meilleures alternatives au Bloc-notes. Mais le Bloc-notes vous permet de choisir explicitement l'encodage lors de l'ouverture d'un fichier (plutôt que de laisser le Bloc-notes pour essayer de deviner).

Marques d'ordre des octets

Selon le consortium Unicode, les marques d'ordre des octets (BOM) sont facultatives. Cependant, Windows s'appuie sur les nomenclatures pour faire la distinction entre certains encodages.

Donc, en bref, peut-être que vos fichiers n'avaient pas de nomenclature pour une raison quelconque? Peut-être que la nomenclature a été perdue au cours du processus de mise à niveau?

Si vous avez toujours les fichiers d'origine qui s'affichent sous forme de carrés, vous pouvez en faire un vidage hexadécimal pour voir s'ils contiennent une nomenclature.


Normes de fichiers en texte brut

Le problème est qu'il n'y a en fait aucune - aucune norme universelle pour les fichiers en texte brut. Au lieu de cela, nous avons un certain nombre d'incompatibilités et d'inconnues.

  • Comment les fins de ligne ont-elles été marquées? Certaines plateformes utilisent les caractères de contrôle Carriage Return (CR) suivis de Line Feed (LF), certaines utilisent CR seul et d'autres utilisent LF seul.

  • Les terminateurs ou séparateurs ci-dessus sont-ils? Cela a un effet à la fin d'un fichier et est connu pour causer des problèmes.

  • Traitement des tabulations et autres caractères de contrôle. Nous pouvons supposer qu'un onglet est utilisé pour s'aligner sur un multiple de 8 largeurs de caractères standard depuis le début de la ligne, mais il n'y a vraiment aucune certitude à ce sujet. De nombreux programmes permettent de modifier la position des onglets.

  • Jeu de caractères et encodage? Il n'y a pas de norme universelle pour indiquer lesquelles ont été utilisées pour le texte du fichier. Le plus proche est de rechercher la présence d'une nomenclature qui indique que le codage est l'un de ceux utilisés pour Unicode. À partir de la valeur de nomenclature, le programme qui lit le fichier peut faire la distinction entre UTF-8 et UTF-16, etc., et entre les variantes Little-Endian et Big-Endian d'UTF-16, etc. Il n'y a pas de norme universelle pour indiquer qu'un fichier est codé dans tout autre codage populaire tel que CP-1252 ou KOI-8.

Etc. Aucune des métadonnées ci-dessus n'est écrite dans le fichier texte - l'utilisateur final doit donc informer le programme lors de la lecture du fichier. L'utilisateur final doit connaître les valeurs de métadonnées pour un fichier spécifique ou courir le risque que son programme utilise les valeurs de métadonnées incorrectes.

Bush a caché les faits

Essayez ceci sur Windows XP.

  • Ouvrez le Bloc-notes.
  • Définissez la police sur Arial Unicode MS. (Vous devrez peut-être l'installer d'abord; si vous ne le voyez pas dans le menu, cliquez sur "Afficher plus de polices".)
  • Entrez le texte "Bush a caché les faits".
  • Choisissez Save As. Dans le Encodingmenu, sélectionnez ANSI.
  • Fermez le bloc-notes.
  • Rouvrez le document (par exemple, en utilisant Start, My Recent Documents).
  • Vous verrez 畂 桳 栠 摩 琠 敨 映 捡 獴 au lieu de "Bush a caché les faits".

Cela illustre que la IsTextUnicodefonction utilisée par le Bloc-notes suppose à tort que le texte ANSI (vraiment Code Page 1252) est Unicode UTF-16LE sans nomenclature. Il n'y a pas de nomenclature dans un fichier enregistré sous ANSI.

Windows 7

Avec Windows 7, Microsoft s'est ajusté IsTextUnicodepour que ce qui précède ne se produise pas. En l'absence d'une nomenclature, il est désormais plus probable de deviner ANSI (CP 1252) que Unicode (UTF-16LE). Avec Windows-7, je suppose que vous êtes donc plus susceptible d'avoir le problème inverse: un fichier contenant des caractères Unicode avec des points de code supérieurs à 255, mais sans nomenclature, est désormais plus susceptible d'être deviné comme étant ANSI - et donc affiché de manière incorrecte.

Prévention des problèmes d'encodage

Actuellement, la meilleure approche semble être d'utiliser UTF-8 partout. Idéalement, vous recoderiez tous les anciens fichiers texte en UTF-8 et n'enregistreriez que les fichiers texte au format UTF-8. Il existe des outils tels que recodage et iconv qui aide peut avec cela.

RedGrittyBrick
la source
3
Selon Wikipédia : dans Windows Vista et Windows 7 [..] IsTextUnicode a été modifié pour le rendre beaucoup plus susceptible de deviner un codage basé sur des octets plutôt que UTF-16LE.
Arjan
Oui, bien sûr, nous avons ces fichiers BOM puisque nous générons ces fichiers avec BOM. Il est intéressant de noter que Windows 7 ne lit pas la nomenclature créée par l'ancien système d'exploitation.
Sha Le
La nomenclature n'a pas changé. Il se peut que vos fichiers ne contiennent pas la nomenclature, mais qu'auparavant, le format par défaut était une variante Unicode, où il est maintenant ASCII. Voir ma réponse.
harrymc
@Sha Le: Si le fichier a une nomenclature, le bloc-notes Windows 7 devrait l'ouvrir correctement, de sorte que le problème que vous décrivez ne correspond pas aux problèmes connus isTextUnicode. Pouvez-vous créer un petit exemple de fichier qui illustre le problème que vous rencontrez avec un fichier qui comprend une nomenclature?
RedGrittyBrick
Il y a aussi this app can breakpour le même effet queBush hid the facts
Regent
3

Une remarque: vous pouvez utiliser Notepad ++ pour visualiser ces fichiers, en utilisant le menu Encoding.

Une fois que les fichiers sont affichés correctement, leur enregistrement ajoute la nomenclature correcte.

harrymc
la source
Je sais que ce message est un peu ancien, mais j'ai actuellement un problème avec win 7 et notepad ++ qui n'affiche pas UTF 8 sans BOM lorsque les fichiers ont été initialement créés à l'aide de notepad ++ v5.9.6.2 lui-même.
Jake
@Jake: assurez-vous que le menu Encodage affiche "Encode in UTF8", plutôt que "Encode in UTF8 without BOM".
harrymc
1

Dans Windows 10 est possible (test sur la version 1903)

  1. Copiez votre fichier avec un bon encodage TXTUTF-8.txtdans C:\WINDOWS\SHELLNEW.
  2. En HKEY_CLASSES_ROOT\.txt\ShellNewfaire une nouvelle chaîne avec le nom " FileName"
  3. Remplacez la valeur de " FileName" par " TXTUTF-8.txt"

Maintenant, lorsque vous créez un nouveau fichier txt à l'aide du menu Windows, il prendra votre TXTUTF-8.txtmodèle

Source: https://answers.microsoft.com/fr-fr/windows/forum/all/configurer-lencodage-par-d%C3%A9faut-en-utf-8-dans/9c0358ca-a2b3-43e8-a154- d10c1fe94317

e2dy Dev
la source