【问题标题】:Objective-C / C Convert UTF8 Literally to Real stringObjective-C / C 将 UTF8 字面量转换为实数字符串
【发布时间】:2015-03-20 06:43:19
【问题描述】:

我想知道如何转换

NSString = "\xC4"; ....

以正常格式表示的真实 NSString

【问题讨论】:

  • “真正的 NSString”和“正常格式”是什么意思?

标签: objective-c c cocoa utf-8


【解决方案1】:

xcode UTF-8 literals 基本相关。当然,"\xC4" 的实际含义是模棱两可的——如果没有指定编码,它就没有任何意义。

如果您指的是 Unicode 代码点为 0x00C4 的字符,那么我认为(尽管我尚未测试)这将满足您的需求。

NSString *s = @"\u00C4";

【讨论】:

    【解决方案2】:

    首先你确定你的字符串中有\xC4 吗?考虑:

    NSString *one = @"\xC4\x80";
    NSString *two = @"\\xC4\\x80";
    NSLog(@"%@ | %@", one, two);
    

    这将输出:

    Ā | \xC4\x80
    

    如果您确定您的字符串包含四个字符\xC4,您确定它是 UTF-8 编码为 ASCII 吗?上面你会看到我添加了\x80,这是因为\xC4不是有效的UTF-8,它是一个两字节序列的第一个字节。也许您只显示了输入的示例并且存在第二个字节,否则您没有将 UTF-8 编码为 ASCII。

    如果您确定它是 UTF-8 编码为 ASCII,您必须自己进行转换。看起来 Cocoa 字符串编码方法可能会处理它,尤其是当您似乎拥有的是一个字符串,因为它可能是用 Objective-C 源代码编写的。不幸的是,明显的编码 NSNonLossyAsciiStringEncoding 只处理八进制和 unicode 转义,而不是字符串中的十六进制转义。

    你可以使用任何你喜欢的算法来转换它。一种选择是一个简单的有限状态机,它一次扫描一个字节并识别四个字节序列:\xhex-digithex-digit;并将两个十六进制数字组合成一个字节。 NSString 不是逐字节字符串处理的最佳选择,最好转换为 C 字符串,例如:

    // sample input, all characters should be ASCII
    NSString *input = @"\\xC4\\x80"; 
    
    // obtain a C string containing the ASCII characters
    const char *cInput = [input cStringUsingEncoding:NSASCIIStringEncoding]; 
    
    // allocate a buffer of the correct length for the result
    char cOutput[strlen(c2a)+1];
    
    // call your function to decode the hexadecimal escapes
    convertAsciiEncodedUTF8(cInput, cOutput);
    
    // create a NSString from the result
    NSString *output = [NSString stringWithCString:cOutput encoding:NSUTF8StringEncoding];
    

    您只需要为convertAsciiEncodedUTF8 编写有限状态机或其他算法。

    (如果你写了一个算法但它失败了,问另一个问题来展示你的代码,有人可能会帮助你。但不要指望有人为你写。)

    HTH

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2014-01-29
      相关资源
      最近更新 更多