Iphone 替换字符串中的unicode值

Iphone 替换字符串中的unicode值,iphone,objective-c,unicode,str-replace,Iphone,Objective C,Unicode,Str Replace,我有一个字符串@“\EOP”。我想把这个分发给用户。但当我在文本字段中显示这个字符串时,它只显示OP。我试着在调试时在控制台中打印它,它显示了OP 所以\E是unicode值,这就是为什么它有一些编码问题。我可以通过以下方式解决此问题: NSString *str=[str stringByReplacingOccurrencesOfString:@"\E" withString:@"\\E"]; 这样,它将显示完美的字符串@“\EOP” 这里我的问题是,可以有更多类似于\E的字符,例如\u。

我有一个字符串
@“\EOP”
。我想把这个分发给用户。但当我在文本字段中显示这个字符串时,它只显示
OP
。我试着在调试时在控制台中打印它,它显示了
OP

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

NSString *str=[str stringByReplacingOccurrencesOfString:@"\E" withString:@"\\E"];
这样,它将显示完美的字符串
@“\EOP”


这里我的问题是,可以有更多类似于
\E
的字符,例如
\u
。如何对所有这些类型的字符实施一个修复?

您始终可以将
\
替换为
\
。这些被称为

示例代码:

NSString *str = @"\EOP";
NSString *myNewStr = [str stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"];
NSLog(@"myNewStr :: %@",myNewStr);

您始终可以将
\
替换为
\
。这些被称为

示例代码:

NSString *str = @"\EOP";
NSString *myNewStr = [str stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"];
NSLog(@"myNewStr :: %@",myNewStr);
如果希望反斜杠(
\
)出现在字符串文字中,则需要在字符串文字中转义它,即

NSString* foo = @"\\EOP";
上面将给出您想要的Unicode序列5C 45 4F 50。

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

NSString* foo = @"\\EOP";

上面给出的是您想要的Unicode序列5C 45 4F 50。

\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);
NSString*str=@“\EOP”;
NSCharacterSet*控件=[NSCharacterSet controlCharacterSet];
静态字符*替换[]={
“0”,空,空,空,空,空,空,空,“\\a”,
“\\b”、“\\t”、“\\n”、“\\v”、“\\f”、“\\r”、NULL、NULL、,
空,空,空,空,空,空,空,空,空,
NULL,NULL,NULL,“\\e”};
NSScanner*scanner=[NSScanner scannerWithString:str];
[扫描仪设置字符stobeskiped:nil];
NSMutableString*结果=[NSMutableString];
而(![scanner isattend]){
NSString*tmp;
//逐字复制所有非控制字符:
if([scanner scanupCharactersFromSet:controls intoString:&tmp]){
[结果字符串:tmp];
}
如果([scanner isattend])
打破
//转义所有控制字符:
if([scanner scanscharactersfromset:controls intoString:&tmp]){
对于(int i=0;i<[tmp长度];i++){
unichar c=[tmp字符索引:i];
char*r;
如果(c
\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);
NSString*str=@“\EOP”;
NSCharacterSet*控件=[NSCharacterSet controlCharacterSet];
静态字符*替换[]={
“0”,空,空,空,空,空,空,空,“\\a”,
“\\b”、“\\t”、“\\n”、“\\v”、“\\f”、“\\r”、NULL、NULL、,
空,空,空,空,空,空,空,空,空,
NULL,NULL,NULL,“\\e”};
NSScanner*scanner=[NSScanner scannerWithString:str];
[扫描仪设置字符stobeskiped:nil];
NSMutableString*结果=[NSMutableString];
而(![scanner isattend]){
NSString*tmp;
//逐字复制所有非控制字符:
if([scanner scanupCharactersFromSet:controls intoString:&tmp]){
[结果字符串:tmp];
}
如果([scanner isattend])
打破
//转义所有控制字符:
if([scanner scanscharactersfromset:controls intoString:&tmp]){
对于(int i=0;i<[tmp长度];i++){
unichar c=[tmp字符索引:i];
char*r;
如果(c
意味着它给出了与以前相同的字符串,就像用这种方法尝试的一样。str=[str STRINGBYREPLACINGOCURNCESOFSTRING:@“\\\”和字符串:@“\\\\”];实际上,该行显示它将用\\替换\。但正如在Nsstring中一样,它不允许使用\我认为我们需要使用\\。它永远不会工作,如果您在Xcode中使用这一行,您可以知道它将生成语法错误。在发布问题之前,我已经尝试过这种方法,但没有工作:(这不起作用。请注意字符串
@“\EOP”
不包含任何反斜杠字符!该字符串的第一个字符是U+0027(“转义”字符),在输入中转义为
\E
,我知道这很混乱!因此尝试用其他内容替换反斜杠是行不通的。这意味着它给出的字符串与之前的相同,就像?OP。用这种方法尝试。str=[str stringByReplacingOccurrencesOfString:@“\\”和string:@“\\\\”];实际上,该行显示它将用\\替换\但在Nsstring中,它不允许使用\我认为我们需要使用\\。它将