2013-10-24 181 views
0

我有一個字符串@"\EOP"。我想把這個消失給用戶。但是,當我在文本字段中顯示該字符串時,它只顯示OP。我試圖在調試時在控制檯上進行打印,它顯示¿OP替換字符串中的Unicode值

所以\E是unicode值,這就是爲什麼它有一些編碼問題。我可以解決這個問題:

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

有了這個它會顯示完美串@"\EOP"

這裏我的問題是,可以有更多的字符相同,如\E,例如\u。我怎樣才能爲所有這些角色實施一個修復程序?

+0

字符串從哪裏來? –

+0

一個問題:爲什麼你使用同一個名字'str'? – Bhavin

+0

@MartinR字符串來自數據庫,但我檢查設置靜態字符串str = @「\ EOP」;但仍然無法工作。 – Nikunj

回答

3

字符串@"\EOP"\E是與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); 
+0

wowww !! What a code !! +1 for you。 – user1673099

+0

很好,是的,這是工作..還有更多的問題,如果我設置\ E而不是\ e或者我可以在這個替換中設置兩個[]: – Nikunj

+0

@ OKNC2:似乎NSString同時接受同一個字符27的'\ e'和'\ E'。但是例如'\ N'不能工作而不是' \ n'換行符,因此我只使用小寫字母 –

1

您可以隨時用\\代替\。這些被稱爲Escape Sequences

示例代碼:

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

呃,我已經試過這種方式,但沒有工作。 – Nikunj

+0

@ OKNC2:**不工作**在什麼方面? – Bhavin

+0

意味着它像以前一樣給予相同的字符串OP。用這種方式嘗試。 str = [str stringByReplacingOccurrencesOfString:@「\\」withString:@「\\\\」]; – Nikunj

0

如果你想有一個反斜槓(\)出現在一個字符串,你需要逃脫它的字符串字面即

NSString* foo = @"\\EOP"; 

以上的將給你的Unicode序列5C 45 4F 50這是你想要的。