我有一个字符串@"\EOP"
。我想对用户不屑一顾。但是当我在文本字段中显示此字符串时,它仅显示OP
。我尝试在调试时在控制台中打印它,它显示¿OP
所以\E
是unicode值,这就是为什么它有一些编码问题。我可以通过以下方式解决这个问题:
NSString *str=[str stringByReplacingOccurrencesOfString:@"\E" withString:@"\\E"];
有了它,它将显示完美的字符串@"\EOP"
。
我的问题是,可能会有更多字符,例如\E
,例如\u
。如何为所有这些字符实现一个修复?
答案 0 :(得分:3)
\E
中的 @"\EOP"
是带有ASCII码(或Unicode)27的字符,
这是一个控制字符。
我不知道一个内置方法来转义字符串中的所有控制字符。
以下代码使用NSScanner
来查找控件字符,并替换它们
使用查找表。控制字符由“字符转义码”替换
如果可能,例如“\ r”或“\ n”,否则使用“\ x”后跟十六进制代码。
NSString *str = @"\EOP";
NSCharacterSet *controls = [NSCharacterSet controlCharacterSet];
static char *replacements[] = {
"0", NULL, NULL, NULL, NULL, NULL, NULL, "\\a",
"\\b", "\\t", "\\n", "\\v", "\\f", "\\r", NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, "\\e"};
NSScanner *scanner = [NSScanner scannerWithString:str];
[scanner setCharactersToBeSkipped:nil];
NSMutableString *result = [NSMutableString string];
while (![scanner isAtEnd]) {
NSString *tmp;
// Copy all non-control characters verbatim:
if ([scanner scanUpToCharactersFromSet:controls intoString:&tmp]) {
[result appendString:tmp];
}
if ([scanner isAtEnd])
break;
// Escape all control characters:
if ([scanner scanCharactersFromSet:controls intoString:&tmp]) {
for (int i = 0; i < [tmp length]; i++) {
unichar c = [tmp characterAtIndex:i];
char *r;
if (c < sizeof(replacements)/sizeof(replacements[0])
&& (r = replacements[c]) != NULL) {
// Replace by well-known character escape code:
[result appendString:@(r)];
} else {
// Replace by \x<hexcode>:
[result appendFormat:@"\\x%02x", c];
}
}
}
}
NSLog(@"%@", result);
答案 1 :(得分:1)
您始终可以将\
替换为\\
。这些被称为Escape Sequences。
示例代码:
NSString *str = @"\EOP";
NSString *myNewStr = [str stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"];
NSLog(@"myNewStr :: %@",myNewStr);
答案 2 :(得分:0)
如果要在字符串文字中出现反斜杠(\
),则需要在字符串文字中将其转义,即
NSString* foo = @"\\EOP";
以上将为您提供Unicode序列5C 45 4F 50,这就是您想要的。