2017-04-13 1 views
-2

Les choses suivantes je me suis rendu compte:
UTF-8, Unicode et comment la machine interprète-t-elle des octets?

  1. caractères Unicode peut être représenté comme jusqu'à 4 octets séquence. Donc, si un caractère est représenté en deux octets ou plus - l'ordre des octets est important en ce qui concerne BEM ou LEM
  2. UTF-8 écrit des octets dans un fichier/flux de réseau octet par octet (écriture ou lecture non multi-octets), ce qui signifie que si un caractère est représenté en deux octets ou plus, tandis que le codage écrit un octet à fois. Ensuite, il n'a pas d'importance BEM ou LEM tout en le décodant relit les octets correctement et ne les échange pas en écrivant ou en lecture .
  3. UTF-16 ou UTF-32 utilisent toujours deux ou quatre octets lors de l'encodage, ce qui fait que LEM ou BEM est important en raison de la lecture/écriture multi-octets.
  4. En outre, je comprends comment UTF-8 sait interpréter les octets comme un caractère lors de la lecture d'un fichier (décodage).

So. voici l'exemple:

J'ai déclaré et initialisé la variable String sous la forme "ANФГ" en C++.
Questions.

  1. en C++ char est un caractère d'un octet de type de données. String la classe est basée sur char[] en C++?
  2. Puis-je déclarer une variable String de cette façon? UTF-8 Encoding est par défaut?
  3. J'ai décidé d'écrire cette chaîne dans un fichier. Cette chaîne doit être représentée par A - un octet, B - un octet, Ф - séquence de deux octets, Г - séquence de deux octets. Comment sera-t-il stocké dans String et dans un fichier? Quelles addreses seront pour ces 6 octets?
  4. Comment sera-t-il lu à partir d'un fichier concernant BEM et LEM? C++ connaît l'ordre des adresses en mémoire où ces octets sont stockés?

EDIT_1: Je ne comprends pas une chose. Si j'ai trois octets: - 1000 1111 - 1100 0000 - 0100 0000 Le premier et le second représentent un caractère en UTF-8, le troisième en représente un également. L'ordre des octets est ce que j'ai écrit ci-dessus. Chaque octet a sa propre adresse, non? Mais lorsque l'écriture multi-octets arrive deux octets sont stockés à un endroit? Je veux dire, tout flux de sortie écrit des données dans l'ordre de gauche à droite? Ensuite, il sera également lu de gauche à droite? Parce que LEM ou BEM échangent des octets .. mais quand il s'agit d'écriture multi-octets. Mais quand nous écrivons seulement un octet à la fois, il a son propre ordre correct de gauche à droite?

+2

ces questions ont reçu une réponse plusieurs fois. En un mot, std :: string est une séquence d'octets. il n'a aucune idée d'encodage, et vous devriez le traiter comme ça. l'une des forces et des faiblesses de C++ qui ne force aucun encodage par défaut. –

Répondre

1
  1. Oui, std::string (ou plutôt, std::basic_string<char>) utilise char pour stocker ses données. Il est agnostique d'encodage, donc si vous appelez par exemple size() vous obtiendrez le nombre réel de char s représentant la chaîne, pas le nombre de caractères ou de points de code.Non, le codage des littéraux de chaîne est défini par l'implémentation. Depuis C++ 11, vous pouvez utiliser le préfixe u8 pour obtenir UTF-8 string literals (par exemple u8"ANФГ").
  2. Si vous avez utilisé des littéraux de chaîne UTF-8, le std::string contiendra UTF-8 et UTF-8 sera écrit dans un fichier si vous utilisez par exemple. operator<<().
  3. C++ ne garde aucune trace du caractère dans lequel se trouve votre fichier (et ne garde donc pas non plus trace de son endianness). Si vous utilisez UTF-8 de bout en bout, l'endianness est sans importance depuis UTF-8 is endianness-independent.
+0

Votre point numéro deux saute la partie importante sur le codage du fichier source d'une manière qui est interprétée par le compilateur. En l'absence de toute interprétation de codage de fichier source utile par le compilateur, les préfixes servent uniquement à traduire, par ex. '" \ u024D "' dans son propre format UTF-8. Le simple fait de supprimer des caractères spéciaux dans le code source n'est pas décrit dans la norme comme un moyen réel de déclarer correctement un littéral de chaîne unicode. – rubenvb