我有一个NSString实例(我们称之为myString
),包含以下UTF-8 unicode字符:xc2x96
(例如,MS Word中的长破折号)。
当使用NSLog
和%@
格式说明符将NSString打印到控制台时,该字符将被一个倒置的问号所取代,表示出现了问题。当将其用作表单元格中的文本时,unicode字符只显示为空格(而不是空字符串-空格)。
为了解决这个问题,我想用"普通"破折号替换xc2x96
unicode字符——起初我认为这应该是一项10秒的任务,但经过一些研究,我还没有找到做到这一点的"正确方法",这就是我希望您帮助的地方。
我尝试过的:
当我像NSLog(@"%x", myString)
这样用十六进制打印myString
时,我会得到十六进制值:代表unicode字符xc2x96
的unicode字符的96
。
利用这些信息,我进行了以下实现,将其替换为"正常"的破折号:
for(int index = 0; index < [myString length]; index++)
{
NSLog(@"Hex:'%x' Char:'%c'", [myString characterAtIndex:index],[myString characterAtIndex:index]);
if([[NSString stringWithFormat:@"%x", [myString characterAtIndex:index]] isEqualToString:@"96"])
myString = [myString stringByReplacingCharactersInRange:NSMakeRange(index, 1) withString:@"-"];
}
它有效,但我的眼睛不喜欢它,我想知道是否可以用更干净、更"正确"的方式来做这件事?例如,像C#的String.Replace(char,char)
,它支持unicode字符。
所以结束:
我正在寻找替换字符串中unicode字符的"正确方法"——我已经做了一些研究,但显然,只有可用的方法可以用另一个NSString
替换给定NSString
的出现。
我已经阅读了以下内容:
- https://stackoverflow.com/a/5223737/700926
- https://stackoverflow.com/a/5217703/700926
- https://stackoverflow.com/a/714009/700926
- https://stackoverflow.com/a/668254/700926
- https://stackoverflow.com/a/2039396/700926
。。。但它们都解释了如何用另一个CCD_ 14替换给定的CCD_。
您可以使字符串可变(例如,使用NSMutableString而不是NSString)。此外,对[[NSString stringWithFormat:@"%x", character] isEqualToString:@"96"]
的调用是尽可能低效的——为什么不简单地调用if (character == 0x96)
呢?总而言之,试试
NSString *longDash = @"xc2x96";
[string replaceOccurrencesOfString:longDash withString:@"-"];