【发布时间】:2015-03-20 06:43:19
【问题描述】:
我想知道如何转换
NSString = "\xC4"; ....
以正常格式表示的真实 NSString
【问题讨论】:
-
“真正的 NSString”和“正常格式”是什么意思?
标签: objective-c c cocoa utf-8
我想知道如何转换
NSString = "\xC4"; ....
以正常格式表示的真实 NSString
【问题讨论】:
标签: objective-c c cocoa utf-8
与xcode UTF-8 literals 基本相关。当然,"\xC4" 的实际含义是模棱两可的——如果没有指定编码,它就没有任何意义。
如果您指的是 Unicode 代码点为 0x00C4 的字符,那么我认为(尽管我尚未测试)这将满足您的需求。
NSString *s = @"\u00C4";
【讨论】:
首先你确定你的字符串中有\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 转义,而不是字符串中的十六进制转义。
你可以使用任何你喜欢的算法来转换它。一种选择是一个简单的有限状态机,它一次扫描一个字节并识别四个字节序列:\、x、hex-digit、hex-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
【讨论】: