在NSString实例中替换给定unicode字符的正确方法是什么



我有一个NSString实例(我们称之为myString),包含以下UTF-8 unicode字符:xc2x96(例如,MS Word中的长破折号)。

当使用NSLog%@格式说明符将NSString打印到控制台时,该字符将被一个倒置的问号所取代,表示出现了问题。当将其用作表单元格中的文本时,unicode字符只显示为空格(而不是空字符串-空格)。

为了解决这个问题,我想用"普通"破折号替换xc2x96unicode字符——起初我认为这应该是一项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:@"-"];

最新更新