在iPhone上检测NSString中的Unicode字符

时间:2009-11-10 09:27:22

标签: iphone unicode nsstring hex

我正在开发一款适用于iPhone的短信应用程序。我需要检测用户是否在他们希望发送的NSString中输入了任何unicode字符。

我需要这样做是因为unicode字符占用了消息中更多的空间,还因为我需要将它们转换为十六进制等价物。

所以我的问题是如何在NSString中检测到unicode字符的存在(我从UITextView中读取)。另外,如何将这些字符转换为UCS-2十六进制等效字符?

E.g繁= 7E41,体= 4F53,中= 4E2D,文= 6587

2 个答案:

答案 0 :(得分:25)

要仅检查ascii字符(或您选择的其他编码),请使用:

[myString canBeConvertedToEncoding:NSASCIIStringEncoding];

如果字符串包含非ascii字符,则返回NO。然后,您可以使用以下命令将字符串转换为UCS-2数据:

[myString dataUsingEncoding:NSUTF16BigEndianStringEncoding];

或NSUTF16LittleEndianStringEncoding,具体取决于您的平台。 UCS-2和UTF-16之间存在细微差别。 UTF-16取代了UCS-2。您可以在这里阅读有关差异的内容:

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

答案 1 :(得分: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。

将尝试另一种替换字符的方法。