web-dev-qa-db-fra.com

Windows 7 UTF-8 et Unicode

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

Détails: Auparavant, je disposais de Windows XP et de fichiers de traduction (codés 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 boîtes carrées (vous savez, si je les ouvre dans un navigateur - j'ai pu voir toute la traduction). Si je sauvegarde ces fichiers au format Unicode, tout semble aller pour le mieux.

Alors, qu'est-ce qui se passe exactement? Pourquoi Windows 7 fonctionne-t-il avec Unicode et non avec UTF-8?

13
Sha Le

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

Terminologie

nicode et TF-8 ne sont pas du 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 cours de transmission. Le même flux de caractères Unicode peut également être codé au format UTF-16, UTF-32 ou UTF-7, par exemple.

Toutefois, le Bloc-notes vous propose des options de "codage" comprenant ANSI, Unicode, Unicode big-endian et UTF-8. Les développeurs de Microsoft qui ont écrit cela ont utilisé les mauvais termes. Quand ils disent "Unicode", ils veulent probablement dire " TF-16little-endian ". Quand ils disent "ANSI", ils veulent dire Code Page 1252 (CP-1252).

Bloc-notes Microsoft

Je pense que le bloc-notes de Microsoft écrit UTF-16 avec une marque d'ordre d'octet ( 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 au format UTF-16 et indique s'il s'agit de big-endian ou de little-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 codage a été utilisé. Parfois (inévitablement), il devine mal. Parfois, il devine qu'un fichier "ANSI" est "Unicode". Essayer d'interpréter un fichier UTF-16 ou UTF-8 comme un code aurait pour effet d'afficher les glyphes incorrects et d'empêcher la recherche de glyphes pour restituer des valeurs de 8 bits. Ces derniers seraient alors affichés sous forme de carrés.

Comme le dit harrymc dans sa réponse , il existe de meilleures alternatives au Notepad. 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 le deviner).

Octet Ordre Marques

Selon le consortium Unicode, les marques d'ordre Byte (BOM) sont facultatives. Cependant, Windows s'appuie sur les nomenclatures pour distinguer certains encodages.

En bref, peut-être que vos fichiers manquaient d'une nomenclature pour une raison quelconque? Peut-être que la nomenclature a été perdue au cours du processus de mise à niveau?

Si les fichiers d'origine apparaissent toujours sous forme de carrés, vous pouvez en créer une copie hexadécimale pour voir s'ils contiennent une nomenclature.


Normes de fichier texte brut

Le problème est qu’il n’existe effectivement aucun - aucun standard universel 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 plates-formes utilisent les caractères de contrôle Carriage Return (CR) suivis du saut de ligne (LF), d'autres utilisent CR uniquement et d'autres LF uniquement.

  • 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 onglets et autres caractères de contrôle. Nous pourrions supposer qu'une tabulation est utilisée pour aligner un multiple de 8 largeurs de caractères standard à partir du début de la ligne, mais en réalité, il n'y a aucune certitude à ce sujet. De nombreux programmes permettent de modifier les positions des onglets.

  • Jeu de caractères et encodage? Il n'y a pas de norme universelle pour indiquer lesquels de ceux-ci ont été utilisés pour le texte du fichier. Le plus proche que nous ayons 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 la nomenclature, le programme qui lit le fichier peut faire la distinction entre UTF-8 et UTF-16, etc., ainsi qu'entre les variantes de Little-Endian et de Big-Endian de UTF-16, etc. Il n'existe pas de norme universelle indiquant qu'un fichier est encodé dans n’importe quel autre encodage 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 de tout fichier spécifique ou courir le risque que son programme utilise les mauvaises valeurs de métadonnées.

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 d'abord l'installer. 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 menu Encoding, sélectionnez ANSI.
  • Fermer 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 montre que la fonction IsTextUnicode utilisée par le Bloc-notes suppose à tort que le texte ANSI (en réalité CodePage 1252) est au format Unicode UTF-16LE sans nomenclature. Il n'y a pas de nomenclature dans un fichier enregistré sous le nom ANSI.

Windows 7

Avec Windows 7, Microsoft a ajusté IsTextUnicode afin que ce qui précède ne se produise pas. En l'absence d'une nomenclature, il est maintenant plus probable que l'ANSI (CP 1252) devienne celui d'Unicode (UTF-16LE). Sous Windows-7, vous vous attendez donc probablement à plus : le fichier contient des caractères Unicode avec des points de code supérieurs à 255, mais sans BOM, est maintenant plus susceptible d'être deviné comme étant ANSI - et donc affiché de manière incorrecte.

Prévenir les problèmes d'encodage

Actuellement, la meilleure approche semble être d’utiliser le format UTF-8 partout. Idéalement, vous recodifiez tous les anciens fichiers texte en UTF-8 et ne sauvegardez que les fichiers texte au format UTF-8. Il existe des outils tels que recode et iconv qui peuvent vous aider.

29
RedGrittyBrick

Une remarque: vous pouvez utiliser Notepad ++ pour afficher ces fichiers à l'aide du menu Encodage.

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

3
harrymc