2013-02-09 4 views
0

Je lis un caractère du fichier '☼' ce caractère est tapé dans le bloc-notes en appuyant sur (ALT + 15), maintenant je dois imprimer ce caractère et la valeur 15 (valeur ASCII respective de ce caractère) sur la console. Le problème est que je reçois un caractère carré avec une valeur ASCII -2. Pourquoi pas cela fonctionne-t-il?Pourquoi ne pas lire un caractère simple dans un fichier?

#include <iostream> 
#include <fstream> 

using namespace std; 
int main() 
{ 
    ifstream myFile; 
    myFile.open("input.txt"); 
    char inputA; 
    myFile>>inputA; 
    cout<<inputA<<endl; 
    cout<<(int)inputA; 



} 
+0

☼ n'est pas un caractère ASCII, c'est un [caractère unicode] (http://www.fileformat.info/info/unicode/char/263c/index.htm). La manière dont le personnage est représenté dépend du codage du fichier. –

+0

Oui J'ai enregistré le fichier avec l'option de caractère Unicode. Mais toujours ne pas lire correctement. – user1974238

+0

Aussi, j'obtiens un résultat différent en enregistrant le fichier avec unicode big endian, unicode, et UTF-10 – user1974238

Répondre

1

☼ est un caractère unicode. Il existe différents codages de caractères Unicode, tels que UTF-8, UTF-16 et UTF-32. Cependant, tous les encodages nécessitent plus d'un octet pour représenter le caractère ☼. En fait, les représentations sont les suivantes:

UTF-8 0xE2 0x98 0xBC 
UTF-16 0x263C 
UTF-32 0x0000263C 

L'ordre des octets dans UTF-16 et UTF-32 dépend de la endianness du système.

Vous essayez de lire le caractère en un seul char. Cela ne fera qu'extraire un seul octet du personnage. Je ne sais pas d'où vient votre -2, mais quand je l'essaie sur un encod codé en UTF-8, j'obtiens la valeur -30. C'est parce qu'un char signé avec la représentation 0xE2 est -30.

La lecture correcte du caractère dépend également de l'encodage. Pour UTF-8, vous devrez lire un tableau de 3 char juste pour ce caractère. Pour UTF-16, vous pouvez utiliser char16_t pour lire un caractère. Pour UTF-32, il y a char32_t.

Questions connexes