2009-11-10 18 views
8

Pracuję nad aplikacją SMS dla iPhone'a. Muszę wykryć, czy użytkownik wprowadził jakiekolwiek znaki Unicode wewnątrz NSString, które chcą wysłać.Wykryj znaki Unicode w NSString na iPhonie

Muszę to zrobić, ponieważ znaki unicode zajmują więcej miejsca w wiadomości, a także dlatego, że muszę przekonwertować je na ich szesnastkowe odpowiedniki.

Moje pytanie brzmi: jak wykryć obecność znaku Unicode w NSString (który czytam z UITextView). W jaki sposób mogę następnie przekonwertować te znaki na ich odpowiedniki szesnastkowe UCS-2?

Np 繁 = 7E41, 体 = 4F53, 中 = 4E2D, 文 = 6587

+0

wszystkie znaki są Unicode – user102008

Odpowiedz

25

Aby sprawdzić tylko znaki ASCII (lub innego kodowania do wyboru) używać:

[mystring canBeConvertedToEncoding: NSASCIIStringEncoding] ;

Zwróci wartość NIE, jeśli ciąg zawiera znaki inne niż ASCII. Następnie możesz przekształcić ciąg znaków w dane UCS-2 za pomocą:

[myString dataUsingEncoding: NSUTF16BigEndianStringEncoding];

lub NSUTF16LittleEndianStringEncoding w zależności od platformy. Istnieją niewielkie różnice między UCS-2 i UTF-16. UTF-16 zastąpił UCS-2. Możesz przeczytać o różnicach tutaj:

http://en.wikipedia.org/wiki/UTF-16/UCS-2

+0

@Jeremy Bower, jeśli wywołuję [atext canBeConvertedToEncoding: NSUnicodeStringEncoding]; zawsze zwraca tak, niezależnie od tego, czy wpisuję znak Unicode (litera tajlandzka), czy litera łacińska. –

+0

@Ilker Baltaci: To dlatego, że znaki mogą być konwertowane na Unicode. Unicode jest nadzbiorem ASCII i zawiera znaki tajlandzkie. –

0

nie mogę uzyskać to do pracy.

I ma ciąg HTML z   NON breaking space

</div>Great Guildford St/SouthwarkSt & nbsp;Stop:& nbsp; BM<br>Walk to SE1 0HL<br> 
"Great Guildford St/SouthwarkSt \U00a0Stop:\U00a0 BM", 

próbowałem 3 rodzaje kodowania/dekodowania

// NSData *asciiData = [instruction dataUsingEncoding:NSUTF16BigEndianStringEncoding];           
// NSString *asciiString = [[NSString alloc] initWithData:asciiData 
//  encoding:NSUTF16BigEndianStringEncoding]; 

// NSData *asciiData = [instruction dataUsingEncoding:NSASCIIStringEncoding];           
// NSString *asciiString = [[NSString alloc] initWithData:asciiData 
//  encoding:NSASCIIStringEncoding]; 

//little endian 
NSData *asciiData = [instruction dataUsingEncoding:NSUTF16LittleEndianStringEncoding];           
NSString *asciiString = [[NSString alloc] initWithData:asciiData 
    encoding:NSUTF16LittleEndianStringEncoding]; 

żaden z nich pracował. Wydawało się pracować tak, jakbym NSLog ciąg to wygląda OK

NSLog(@"HAS UNICODE :%@", instruction); 
..do encode/decode 
NSLog(@"UNICODE AFTER:%@", asciiString); 

Które wyjście

HAS UNICODE: St/SouthwarkSt  Stop:  BM 
UNICODE AFTER: St/SouthwarkSt  Stop:  BM 

ale zdarzyło mi się przechowywać je w NSArray i zdarzyło mi się nazwać [stringArray description] i wszystkie Unicode nadal tam

instructionsArrayString: (
    "Great Guildford St/SouthwarkSt \U00a0Stop:\U00a0 BM", 
    "Walk to SE1 0HL" 
) 

więc coś w NSLog ukrywa &nbsp; ale pojawia się w opisie NSArray więc można pomyśleć zabawie remo jeśli nie masz kodu Unicode.

Spróbuję innej metody, która zastąpi znaki.