2009-11-10 20 views
8

Sto lavorando su un'applicazione SMS per iPhone. Devo rilevare se l'utente ha inserito caratteri unicode all'interno della NSString che desiderano inviare.Rileva caratteri Unicode in NSString su iPhone

Ho bisogno di fare questo perché i caratteri unicode occupano più spazio nel messaggio, e anche perché ho bisogno di convertirli nei loro equivalenti esadecimali.

Quindi la mia domanda è come rilevare la presenza di un carattere Unicode in un NSString (che ho letto da un UITextView). Inoltre, come posso convertire quei caratteri nei loro equivalenti esadecimali UCS-2?

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

+0

tutti i caratteri sono unicode – user102008

risposta

25

Per verificare la presenza di caratteri ASCII solo (o un'altra codifica di vostra scelta) uso:

[myString canBeConvertedToEncoding: NSASCIIStringEncoding] ;

Restituirà NO se la stringa contiene caratteri non ascii. È quindi possibile convertire la stringa in dati UCS-2 con:

[myString dataUsingEncoding: NSUTF16BigEndianStringEncoding];

o NSUTF16LittleEndianStringEncoding in base alla piattaforma. Ci sono lievi differenze tra UCS-2 e UTF-16. UTF-16 ha sostituito UCS-2. È possibile leggere le differenze qui:

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

+0

@Jeremy Bower se si chiama [atext canBeConvertedToEncoding: NSUnicodeStringEncoding]; restituisce sempre sì a prescindere se digito un char unicode (lettera Thai) o una lettera latina. –

+0

@Ilker Baltaci: Questo perché i personaggi possono essere convertiti in unicode. Unicode è un superset di ASCII e include caratteri tailandesi. –

0

non ho potuto ottenere questo lavoro.

I dispone di una stringa HTML con   NON ROTTURA SPAZIO

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

ho provato 3 tipi di codifica/decodifica

// 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]; 

nessuno di questi ha lavorato. Sembravano a lavorare come se io NSLog la corda sembra ok

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

quale uscita

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

ma mi è capitato di memorizzare questi in un NSArray e mi è capitato di chiamare [stringArray description] e tutto l'unicode era ancora lì

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

quindi qualcosa in NSLog nasconde &nbsp; ma si presenta nella descrizione NSArray così si potrebbe pensare youve REMO vedendo l'Unicode quando non l'hai fatto.

Proverà un altro metodo che sostituisce i caratteri.