【问题标题】:How can I escape unicode characters in a NSString?如何转义 NSString 中的 unicode 字符?
【发布时间】:2010-03-31 18:52:37
【问题描述】:

当我在某个 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 转换为这种转义表示?

【问题讨论】:

    标签: cocoa unicode nsstring escaping


    【解决方案1】:

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

    【讨论】:

    • 不应该通过测试来确定是否对字符进行 Unicode 转义“if (uniBuffer[i] > 0x7f)”吗?在 UTF-8 编码中(至少),即使 0x7f 是非打印的,它也是一个有效的单字节字符。
    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 2010-11-02
      • 2010-09-16
      • 2013-12-30
      • 2018-12-16
      • 1970-01-01
      相关资源
      最近更新 更多