2 votes

Comment naviguer dans un fichier texte UTF-8

J'ai un fichier texte en UTF-8 que je dois faire naviguer en C. Je dois diviser ce fichier en plusieurs fichiers plus petits (c'est-à-dire le couper en deux). Lorsque cela se produit, il arrive que les caractères multi-octets soient divisés en deux fichiers différents. Lorsqu'un éditeur de texte débile lit le fichier contenant la seconde moitié du texte, il lit la seconde moitié du caractère coupé et s'embrouille, ce qui l'empêche d'afficher correctement le reste du texte. Si je lis octet par octet, comment puis-je savoir si je suis au début ou au milieu d'un caractère ? Les caractères UTF-8 non compatibles avec l'ascii commencent tous avec le bit de tête à 1, mais certains ont deux octets et d'autres trois.

Edit : Nevermind, je viens de découvrir que le premier octet contient le nombre de premiers 1 que le caractère est long. Par exemple, un caractère de trois octets est 1110xxxx xxxxxxxx xxxxxxxx.

3voto

Alter Mann Points 10564
if ((*s & 0xc0) == 0x80) /* You are in the middle of */;

2voto

ouah Points 75311

Les caractères UTF-8 sont représentés par 1 à 4 octets.

Vérifiez un octet, si vous avez ce modèle binaire :

10xxxxxx

vous êtes au milieu d'un multioctet. Et vous devez continuer jusqu'au prochain caractère de tête.

Si vous avez ça :

0xxxxxxx

vous avez un caractère de 1 octet.

 110xxxxx

est l'octet de tête d'un caractère de 2 octets

 1110xxxx

est l'octet de tête d'un caractère de 3 octets

y

 11110xxx

est l'octet de tête d'un caractère de 4 octets

1voto

ctn Points 2183

Tous les caractères UTF-8 sont constitués d'un octet de tête et de zéro ou plusieurs octets de suite. Tous les octets de continuation sont de la forme "10xxxxxx" en binaire. Tous les octets de tête sont donc de l'une des deux formes suivantes : "0xxxxxxx" ou "11xxxxxx".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X