2010-03-31 101 views
6

当我存储一些的NSDictionary内的NSString和日志字典这样的控制台:如何在NSString中转义unicode字符?

NSString *someString = @"Münster"; 
NSDictionary *someDict = [ NSDictionary dictionaryWithObjectsAndKeys: 
    someString, @"thestring" ]; 
NSLog (@"someDict: %@", [ someDict description ]); 

控制台输出看起来是这样的:

unicode_test[3621:903] someDict: 
{ 
    thestring = "M\U00fcnster"; 
} 

以字符串的Unicode字符转义。 是否有任何方法将NSString转换为此转义表示?

回答

6

该问题可以通过使用给定字符串的UniChar字符串表示形式的循环来解决。实现扩展上的NSString它会是这个样子:

- (NSString *) escapedUnicode 
{ 
    NSMutableString *uniString = [ [ NSMutableString alloc ] init ]; 
    UniChar *uniBuffer = (UniChar *) malloc (sizeof(UniChar) * [ self length ]); 
    CFRange stringRange = CFRangeMake (0, [ self length ]); 

    CFStringGetCharacters ((CFStringRef)self, stringRange, uniBuffer); 

    for (int i = 0; i < [ self length ]; i++) { 
     if (uniBuffer[i] > 0x7e) 
      [ uniString appendFormat: @"\\u%04x", uniBuffer[i] ]; 
     else 
      [ uniString appendFormat: @"%c", uniBuffer[i] ]; 
    } 

    free (uniBuffer); 

    NSString *retString = [ NSString stringWithString: uniString ]; 
    [ uniString release ]; 

    return retString; 
} 
+0

不应该的测试,以确定是否为Unicode转义“如果(uniBuffer [I]> 0x7f)中的”字呢?在UTF-8编码(至少)中,即使0x7f不是打印,它也是一个有效的单字节字符。 – erikprice 2011-10-25 19:01:45

1
NSDictionary *someDict = [ NSDictionary dictionaryWithObjectsAndKeys: 
    someString, @"thestring" ]; 

不要忘了nil前哨。 ;)

控制台输出看起来是这样的:

unicode_test[3621:903] someDict: 
{ 
    thestring = "M\U00fcnster"; 
} 

以字符串的Unicode字符转义。

它们是全部 Unicode字符。

是否有任何方法将NSString转换为此转义表示?

这就是字典(或NSPropertyListSerialization的一些私有方法或CFPropertyList的私有函数),而不是字符串。该输出中的\ U序列是OpenStep plist格式的一部分。如果使用NSPropertyListSerialization将plist作为XML输出,则会发现ü(当前)编码为裸UTF-8。

据我所知,没有内置的方法,公共或私人,将只为你一个字符串逃脱。最接近的是strvis函数,但它的工作原理是逐字节的;它不理解Unicode或UTF。

相关问题