0

我有一个字符串@"\EOP"。我想将此支付给用户。但是当我在文本字段中显示这个字符串时,它只显示OP. 我尝试在调试时在控制台中打印它并显示¿OP

unicode 值也是如此\E,这就是为什么它存在一些编码问题。我可以通过以下方式解决此问题:

NSString *str=[str stringByReplacingOccurrencesOfString:@"\E" withString:@"\\E"];

有了这个,它将显示完美的字符串@"\EOP"

在这里,我的问题是可以有更多相同的字符\E,例如\u。我怎样才能为所有这些类型的字符实现一个修复?

4

3 回答 3

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);
于 2013-10-24T12:58:58.490 回答
1

您可以随时替换\\\. 这些称为转义序列

示例代码:

NSString *str = @"\EOP";
NSString *myNewStr = [str stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"];
NSLog(@"myNewStr :: %@",myNewStr);
于 2013-10-24T11:45:58.727 回答
0

如果您希望反斜杠 ( \) 出现在字符串文字中,则需要在字符串文字中对其进行转义,即

NSString* foo = @"\\EOP";

以上将为您提供您想要的 Unicode 序列 5C 45 4F 50。

于 2013-10-24T12:13:41.687 回答