2013-06-04 14 views
5

że posiada kilka znaków UNICODE opakowane w NSNumber tak:NSString z Unicode

@(0x1f4de), // EntypoIconTypePhone 
@(0x1f4f1), // EntypoIconTypeMobile 
@(0xe789),  // EntypoIconTypeMouse 
@(0xe723),  // EntypoIconTypeAddress 
@(0x2709),  // EntypoIconTypeMail 
@(0x1f53f), // EntypoIconTypePaperPlane 
@(0x270e),  // EntypoIconTypePencil 

Są ikony z czcionki Entypo (zalecane).

Jest to kod używam do tworzenia NSString z unicode:

NSNumber *u = self.unicodeLookup[type]; 

int unicode = [u intValue]; 
UniChar chars[] = {unicode}; 

NSString *string = [[NSString alloc] initWithCharacters:chars length:sizeof(chars)/sizeof(UniChar)]; 

Co ja znalezieniem jest to, że niektóre z tych ikon są tworzone zgodnie z oczekiwaniami, ale nie wszystkie z nich; a z tego, co widzę, to unikody, które zawierają 5 cyfr, które nie są prawidłowo tworzone.

Na przykład, te prace:

@(0xe723),  // EntypoIconTypeAddress 
@(0x2709),  // EntypoIconTypeMail 

ale te nie:

@(0x1f4de), // EntypoIconTypePhone 
@(0x1f4f1), // EntypoIconTypeMobile 

Jestem całkiem pewien, że to jest mój kod konwersji. Naprawdę nie rozumiem całego tego kodującego malarka.

+0

+1 za malarkey – uchuugaka

Odpowiedz

2

Jeśli przechowywania stałych postaciach używając unichar zamiast NSNumber obiektów, a następnie sam kompilator powie powód:

unichar chars[] = 
{ 
    0xe723,  // EntypoIconTypeAddress 
    0x2709,  // EntypoIconTypeMail 
    0x1f4de, // EntypoIconTypePhone 
    0x1f4f1  // EntypoIconTypeMobile 
}; 

Implicit conversion from 'int' to 'unichar' (aka 'unsigned short') changes value from 128222 to 62686 
Implicit conversion from 'int' to 'unichar' (aka 'unsigned short') changes value from 128241 to 62705 

Jako iOS/OSX korzysta z 16-bitowej reprezentacji znaków Unicode wewnętrznie, i 0x1f4de i 0x1f4f1 są zarówno 32-bitowe, masz zamiar trzeba kodować te znaki jako zastępcze parach:

a = 0x1f4de - 0x10000 = 0xf4de 
high = a >> 10 = 0x3d 
low = a & 0x3ff = 0xde 
w1 = high + 0xd800 = 0xd83d 
w2 = low + 0xdc00 = 0xdcde 

0x1f4de (UTF-32) = 0xd83d 0xdcde (UTF-16) 

(Zobacz ten Wikipedia page).

Efekt jest taki, że nie można użyć pojedynczej tablicy znaków Unicode, ponieważ będziesz musiał znać długość kodowania każdej z postaci.

+0

Udało mi się uzyskać znaki w twoim przykładzie do wyświetlenia, używając kodu w drugim komentarzu. Jedynym problemem jest teraz czcionka Social Font. Dzięki za twoją radę, pobawię się, żeby sprawdzić, czy mogę je również zmusić do pracy. –

+0

Zauważyłem ostrzeżenia, gdy użyłem unichar, ale działa, jeśli po prostu rzuciłem tablicę na int. –

+0

@LeeProbert 'int' zawsze będzie co najmniej 32-bitowe, ale' unichar' jest zawsze 16-bitowe. Opcją dla ciebie będzie przechowywanie twoich znaków jako UTF-32 (w 'unsigned', nie' unichar'), a następnie użycie '[NSString initWithBytes: length: encoding:]' z kodowaniem 'NSUTF32StringEncoding', jednak istnieje mogą być problemy z endianizmem do rozwiązania (nie zaglądałem do tego). – trojanfoe

2

Gdybym to wykorzystać, aby stworzyć mój ciąg działa dla Unicode int wartości czcionek Entypo:

int unicode = uniChars[type]; 

NSString* s = [[NSString alloc] initWithBytes:&unicode length:sizeof(unicode) encoding:NSUTF32LittleEndianStringEncoding]; 

uniChars JEST CArray z int s zamiast NSArray z NSNumber s miałem poprzednio. Nie ma powodu, aby tak naprawdę, powinien działać z obu.

UPDATE:

Jest jeszcze problem z niektórymi numerami Unicode. Znaki czcionki Entypo Social nie są wyświetlane. Różnica między nimi a normalnych ikon jest to, że wszyscy zaczną F i ma 4 znaki:

0xF300 ,   // EntypoIconSocialTypeGithub, 
0xF301 ,   // EntypoIconSocialTypeCGithub, 
0xF303 ,   // EntypoIconSocialTypeFlickr, 
0xF304 ,   // EntypoIconSocialTypeCFlickr, 

Podejrzewam kodowanie byłoby inaczej.