Je reçois la saisie de la console de l'utilisateur et je veux le coder à UTF-8. Ma compréhension est C ++ n'a pas de codage standard pour les flux d'entrée et qu'elle dépend plutôt du compilateur, de l'environnement d'exécution, de la localisation et de ce qui n'est pas. P>
Comment puis-je déterminer le codage d'entrée en examinant les octets de l'entrée? P>
5 Réponses :
En général, vous ne pouvez pas. Si je tire un flux d'octets générés au hasard à votre application, comment peut-il déterminer leur "codage"? Il vous suffit de spécifier que votre application accepte certains codages ou en supposant que les mains du système d'exploitation vous serez codées de manière appropriée. P>
Pour y construire, vous pouvez utiliser l'environnement pour déterminer une défaillance raisonnable. Jetez un coup d'œil à $ Lang et la commande locale, si votre système d'exploitation les soutient.
Vérification générale de savoir si l'entrée est UTF est une question d'heuristique - il n'y a pas d'algorithme définitif qui vous indiquera "oui / non". Plus l'heuristique est complexe, les moins fausses positifs / négatifs que vous obtiendrez, mais il n'y a pas de "assurance".
Pour un exemple de heuristique, vous pouvez consulter cette bibliothèque: http://utfcppl.sourceforge.net/ p> Vous pouvez l'utiliser ou vérifier sa Sources Comment ils l'ont fait. p> p>
NOTE - Cela vous dit si cela pourrait être UTF8, vous ne pouvez pas savoir si c'est le cas. Un flux d'ASCII de 7 bits réguliers est UTF8 jusqu'à ce que vous ayez frappé le premier caractère accentué.
Vérification i> Si l'entrée est valide UTF-8 ou non n'est pas heureuse (c'est ce que votre fonction fait), mais la détermination de l'UTF-8 était la intention de l'utilisateur i> est.
Utilisez les moyens du système d'exploitation intégré. Celles-ci varient d'un système d'exploitation à l'autre. Sous Windows, il est toujours préférable d'utiliser des API Widecharar et de ne pas penser à l'encodage du tout. P>
et si votre entrée provient d'un fichier, par opposition à une console réelle, tous les paris sont éteints. P>
Jared Oberhaus a répondu à ce puits sur un Question associée spécifique à Java. p>
Fondamentalement, il y a quelques étapes que vous pouvez prendre pour faire une devin raisonnable, mais en fin de compte, il suffit de deviner sans indication explicite. (D'où le marqueur de nomenaire célèbre (IN) dans les fichiers UTF-8) P>
Comme cela a déjà été dit en réponse à la Question John Weldon a souligné A>, il existe un certain nombre de bibliothèques qui codent sur le caractère de reconnaissance. Vous pouvez aussi jeter un coup d'oeil à la
Source de la commande Unix ASCII, ISO-8859-X, des ensembles de caractères étendus non-ASCII à 8 bits non iSO (tels que ceux utilisés sur les systèmes Macintosh et IBM PC), UTF-8-codé Unicode, UTF-16-codé Unicode, et Les ensembles de caractères EBCDIC peuvent être distingués par les différentes gammes et séquences d'octets qui constituent un texte imprimable dans chaque ensemble. P>
blockQuote>
PCRE fournit une fonction de tester une chaîne donnée pour son entièrement valide UTF-8. p> Fichier code> et voyez quels tests il utilise pour déterminer le codage du fichier. De la page man
fichier code>: p>