Objective-C / C将UTF8逐字转换为Real字符串

时间:2015-03-20 06:43:20

标签: objective-c c cocoa utf-8

我想知道如何转换

NSString = "\xC4"; ....

以正常格式表示的真实NSString

2 个答案:

答案 0 :(得分:1)

xcode UTF-8 literals基本相关。当然,你真正的意思是" \ xC4" - 如果没有指定编码,则没有任何意义。

如果您指的是Unicode代码点为0x00C4的字符,那么我会认为(虽然我没有经过测试)这可以达到您想要的效果。

NSString * s = @" \ u00C4&#34 ;;

答案 1 :(得分:0)

首先,您确定字符串中有\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