2009-11-10 62 views
8

我正在爲iPhone的SMS應用程序工作。我需要檢測用戶是否在他們希望發送的NSString中輸入了任何unicode字符。在iPhone上檢測NSString中的Unicode字符

我需要這樣做是因爲unicode字符在消息中佔用更多空間,也因爲我需要將它們轉換爲它們的十六進制等價物。

所以我的問題是如何檢測NSString(我從UITextView讀取)的Unicode字符的存在。另外,如何將這些字符轉換爲UCS-2十六進制等價物?

例如繁= 7E41,體= 4F53,中= 4E2D,文= 6587

+0

所有字符都是unicode – user102008 2010-11-09 03:46:34

回答

25

要檢查只有ASCII字符(或選擇的另一種編碼)使用:

[myString的canBeConvertedToEncoding:NSASCIIStringEncoding] ;

如果字符串包含非ascii字符,它將返回NO。然後,您可以將字符串轉換爲UCS-2數據:

[myString dataUsingEncoding:NSUTF16BigEndianStringEncoding];

或NSUTF16LittleEndianString根據您的平臺編碼。 UCS-2和UTF-16之間略有不同。 UTF-16取代了UCS-2。你可以閱讀這裏的區別:

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

+0

@Jeremy Bower如果我調用[atext canBeConvertedToEncoding:NSUnicodeStringEncoding];無論我輸入unicode字符(泰文字母)還是拉丁字母,它總是返回yes。 – 2012-08-07 07:25:48

+0

@Ilker Baltaci:那是因爲這些角色可以轉換爲unicode。 Unicode是ASCII的超集,包含泰文字符。 – 2012-08-31 21:57:42

0

我不能得到這個工作。

我有一個HTML字符串 不換行空格

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

我試過3種類型的編碼/解碼的

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

這些都不奏效。 他們似乎工作,如果我的NSLog它看起來不錯

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

哪個輸出

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

繩子,但我碰巧這些存儲在一個NSArray,我又恰巧打電話[stringArray description]和所有的unicode被還在裏面

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

所以東西的NSLog隱藏&nbsp;但在NSArray中的描述顯示出來,所以你可能會認爲你已雷莫當你還沒有的時候,你就可以使用Unicode了。

將嘗試另一種替換字符的方法。