如何在NSString中转义unicode字符?

时间:2010-03-31 18:52:37

标签: cocoa unicode nsstring escaping

当我在一些NSDictionary中存储NSString并将该字典记录到控制台时,如下所示:

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

控制台输出如下所示:

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

字符串的unicode字符被转义。 是否有任何方法可以将NSString转换为此转义表示形式?

2 个答案:

答案 0 :(得分:7)

可以使用给定字符串的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;  
}

答案 1 :(得分:2)

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。