iOS某些八进制转义序列导致stringWithUTF8String为nil

时间:2011-06-16 07:02:39

标签: iphone ios unicode

我们的代码调用stringWithUTF8String,但我们使用的一些数据在字符串中使用了octal序列\ 340。这导致一些代码中断,因为我们永远不会期望函数返回nil。我做了一些研究,发现来自\ 200- \ 777的任何八进制序列都会给出相同的结果。我知道我可以处理这个返回nil但我想知道它为什么会返回nil,以及那些八进制转义被解释为。

NSString *result = [NSString stringWithUTF8String:"Mfile \340 xyz.jpg"];

运行此代码返回nil以获取结果。似乎为了防御性地编码,我们将不得不在我们使用它的任何地方检查空结果,这似乎是不幸的。该函数的文档没有说明返回nil的可能性。我敢打赌,那里有很多代码也没有检查它。

3 个答案:

答案 0 :(得分:2)

UTF-8 Character Table没有\340的条目。您需要使用ASCII编码。做,

NSString * result = [NSString stringWithCString:"Mfile \340 xyz.jpg" encoding:NSASCIIStringEncoding];
NSLog(@"%@", result); 

答案 1 :(得分:0)

如果您希望iOS以UTF-8的形式处理它,您必须确保它传递给它的是有效的UTF-8字符,因此您可能需要将八进制字符转换为人类可读的字符。

答案 2 :(得分:0)

我添加了一个名为safeStringWithUTF8String的类:它在所有地方都被调用,而不是只检查nil的返回值,如果无效则返回空字符串。不是很好,但不确定还有什么要做,我们必须能够处理传入的任何数据。