我正在开发一款适用于iPhone的短信应用程序。我需要检测用户是否在他们希望发送的NSString中输入了任何unicode字符。
我需要这样做是因为unicode字符占用了消息中更多的空间,还因为我需要将它们转换为十六进制等价物。
所以我的问题是如何在NSString中检测到unicode字符的存在(我从UITextView中读取)。另外,如何将这些字符转换为UCS-2十六进制等效字符?
E.g繁= 7E41,体= 4F53,中= 4E2D,文= 6587
答案 0 :(得分:25)
要仅检查ascii字符(或您选择的其他编码),请使用:
[myString canBeConvertedToEncoding:NSASCIIStringEncoding];
如果字符串包含非ascii字符,则返回NO。然后,您可以使用以下命令将字符串转换为UCS-2数据:
[myString dataUsingEncoding:NSUTF16BigEndianStringEncoding];
或NSUTF16LittleEndianStringEncoding,具体取决于您的平台。 UCS-2和UTF-16之间存在细微差别。 UTF-16取代了UCS-2。您可以在这里阅读有关差异的内容:
答案 1 :(得分:0)
我无法让它发挥作用。
我有一个带有
非破坏空间
</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中的某些内容隐藏了
,但它出现在NSArray描述中,因此您可能认为在没有时删除了Unicode。
将尝试另一种替换字符的方法。