在iPhone上检测NSString中的Unicode字符

9
我正在开发一款iPhone短信应用程序。我需要检测用户在他们想要发送的NSString中是否输入了任何Unicode字符。
我需要这样做是因为Unicode字符在消息中占用更多的空间,而且我需要将它们转换为十六进制等价物。
那么我的问题是如何检测NSString中是否存在Unicode字符(我从UITextView中读取)。另外,我该如何将这些字符转换成它们的UCS-2十六进制等价物?
例如: 繁 = 7E41,体 = 4F53,中 = 4E2D,文 = 6587。
2个回答

27

要检查字符串中是否只有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


@Jeremy Bower 如果我调用[atext canBeConvertedToEncoding:NSUnicodeStringEncoding];,它总是返回“是”,无论我输入的是Unicode字符(泰文)还是拉丁字母。 - Ilker Baltaci
@Ilker Baltaci:这是因为字符可以转换为Unicode。 Unicode是ASCII的超集,包括泰语字符。 - Jeremy Bower

0

我无法让它工作。

我有一个带有 不间断空格的HTML字符串

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

我尝试了三种编码/解码方式

// 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,实际上并没有。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接