如何从NSString中删除隐藏的字符?

时间:2014-07-17 12:14:21

标签: objective-c macos cocoa

从网络上复制粘贴文本后,在我的mac应用程序NSTextArea中,我看到了

EE

如果我在浏览器中复制这两个字母,我会看到:

E?E

如果我在google翻译中复制它们,我会

E 'E

我无法在两个E之间识别出这个角色。但问题是:如何从我的NSString中删除这些隐藏的角色?

1 个答案:

答案 0 :(得分:5)

在上传的文件中,隐藏字符的特定十六进制代码为0x18

(通过Hex Fiend发现)

enter image description here

此角色以及其他角色是“control character集”的一部分。该集还包含选项卡(0x09)和换行符(0x0A)等字符 - 显然我们不想删除它们。

在Objective-C中,我们可以将NSCharacterSet controlCharacterSet whitespaceAndNewlineCharacterSet 结合使用,以获得没有渲染宽度的空白字符。

NSMutableCharacterSet* zeroWidthCharacterSet = [[NSCharacterSet controlCharacterSet] mutableCopy];
[zeroWidthCharacterSet formIntersectionWithCharacterSet:[[NSCharacterSet whitespaceAndNewlineCharacterSet] invertedSet]];

然后我们可以简单地使用旧的分裂字符集方法

string = [[string componentsSeparatedByCharactersInSet:zeroWidthCharacterSet] componentsJoinedByString:@""];

请注意,如果使用多个UTF8字符表示自身的特殊字符(如表情符号)使用0x18,则剥离它会破坏字符组合

因为控制字符是特殊的,我不相信你会在表情符号序列中找到它们。