替换字符串中的unicode值

时间:2013-10-24 11:42:39

标签: iphone objective-c unicode str-replace

我有一个字符串@"\EOP"。我想对用户不屑一顾。但是当我在文本字段中显示此字符串时,它仅显示OP。我尝试在调试时在控制台中打印它,它显示¿OP

所以\E是unicode值,这就是为什么它有一些编码问题。我可以通过以下方式解决这个问题:

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

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

我的问题是,可能会有更多字符,例如\E,例如\u。如何为所有这些字符实现一个修复?

3 个答案:

答案 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,这就是您想要的。