Comment faire pour convertir un unichar de la valeur à un NSString en Objective-C?
J'ai un caractère international stockées dans un unichar variable. Ce personnage n'est pas venu à partir d'un fichier ou d'une url. La variable elle-même que les magasins unsigned short(0xce91) qui est au format UTF-8 et se traduit par la lettre majuscule grecque 'Un'. Je suis en train de mettre le personnage dans un NSString variable, mais j'échoue lamentablement.
J'ai essayé 2 façons différentes à la fois de ce qui échoue:
unichar greekAlpha = 0xce91; //could have written greekAlpha = 'Α' instead.
NSString *theString = [NSString stringWithFormat:@"Greek Alpha: %C", greekAlpha];
Rien de bon. Je reçois un peu bizarre caractères chinois. Au passage, cela fonctionne parfaitement avec les caractères anglais.
Puis, j'ai aussi essayé ceci:
NSString *byteString = [[NSString alloc] initWithBytes:&greekAlpha
length:sizeof(unichar)
encoding:NSUTF8StringEncoding];
Mais cela ne fonctionne pas non plus.
Je suis évidemment faire quelque chose de mal, mais je ne sais pas quoi.
Quelqu'un peut-il m'aider s'il vous plaît ?
Merci!
- Vous pouvez mettre en forme le code pour la belle mise en forme en appuyant sur le petit bouton en disant: 101010 dans la barre d'outils editeur.
- Merci de me le faire savoir 🙂
- Êtes-vous sûr
unichar
est le bon type de données à l'aide ici? Le stockage des données UTF-8 dans un type destiné à être utilisé pour l'UTF-16 sent mauvais. Comme indiqué par Jon Jardine, il y a des caractères UTF-8 de plus de 16 bits... Pourriez-vous utiliser NSString pour le seul char trop (NSString greekAlpha = @"Α"
et ensuite utiliser %@ dansstringWithFormat
)? - 0xce91 est en fait l'Unicode pour "HANGUL SYLLABE KAEG", donc je ne peux pas comprendre pourquoi vous pouvez vous attendre à obtenir un caractère Alpha à partir de cela. Vous semblez confondre par la LETTRE minuscule LATINE ALPHA étant 0xc9, 0x91 en UTF-8. Totalement différent de l'encodage. La valeur Unicode est 0x0251.
Vous devez vous connecter pour publier un commentaire.
Depuis
0xce91
est dans le format UTF-8 et%C
s'attend à ce qu'il soit en UTF-16 une solution simple comme celle ci-dessus ne fonctionne pas. PourstringWithFormat:@"%C"
fonctionne, vous devez d'entrée0x391
qui est de l'unicode UTF-16.Afin de créer une chaîne UTF-8 unichar vous avez besoin de première division, l'unicode, en octets, puis utiliser
initWithBytes:length:encoding
.Et maintenant, vous pouvez incorporer NSString dans une autre manière que vous le souhaitez. Notez, cependant, qu'il est maintenant légal de type grec alpha directement dans un NSString littérale.
La réponse ci-dessus est bien, mais il ne tient pas compte des caractères UTF-8 de plus de 16 bits, par exemple, les points de suspension symbole - 0xE2,0x80,0xA6. Voici un tweak pour le code:
Note les différents chaîne d'initialisation de la méthode qui ne nécessite pas de paramètre longueur.
utf8char
ne pouvait pas tenir une valeur de plus de 16 bits.Ici est un algorithme de codage UTF-8 sur un seul personnage:
Le code ci-dessus est l'équivalent moral de
unichar foo = 'abc';
.Le problème est que
'Α'
ne correspondent pas à un seul octet dans l'exécution "jeu de caractères" (je suppose que UTF-8) qui est "la mise en œuvre définies" dans C99 §6.4.4.4 10:Une façon est de faire
'ab'
égal à'a'<<8|b
. Certains Mac/iOS système d'en-têtes de compter sur cela pour des choses commeOSType
/FourCharCode
/FourCC; le seul dans iOS qui vient à l'esprit est CoreVideo formats de pixel. C'est, cependant, non portables.Si vous voulez vraiment un
unichar
littéral, vous pouvez essayer deL'A'
(techniquement, c'est unwchar_t
littérale, mais sur OS X et iOS,wchar_t
est généralement UTF-16 donc il va travailler pour les choses à l'intérieur de la BMP). Cependant, il est beaucoup plus simple pour utiliser@"Α"
(qui fonctionne aussi longtemps que vous le définissez la source de codage de caractères correctement) ou@"\u0391"
(qui a travaillé depuis au moins l'iOS 3 SDK).