2013-10-31 71 views
1

我尝试使用下面的调用转换NSString到C-String`:错误转换的NSString C-字符串

NSString* path = ... 
const char* str = [path cStringUsingEncoding: NSUTF16StringEncoding]; 

path包含的文件路径。但是,我越来越像“/”一样。当我使用这个调用来代替:

const char* str = [path UTF8String]; 

返回str是好的,即我得到所需的路径为C-字符串。但是,我需要确保转换在任何情况下都能正常工作,而不管路径中使用的类型编码是什么,即我想处理unicode字符。为此,我需要使用最初的呼叫。

我犯了什么错误?

回答

3

这是因为你选择的编码。 UTF-16将返回16位字符,并且您期待8位字符(即UTF-8)。

因此,如果路径与/,将返回为0x2F00开始(假设小端编码)和00序列看起来串的结束。

+0

这是正确的。但是,如何确保代码处理所有的Unicode字符? – Sankalp

+0

@Sankalp不知道你真的可以。每种类型的unicode编码(UTF-8,-16,-32)以及每种类型的endian(大小)都需要特殊处理。我认为你应该总是期望和处理UTF-8,而不是别的。如果你有外部编码的字符串(例如在文件中),那么在你的程序处理之前(即它们在加载时),这些字符串应该转换为UTF-8。 – trojanfoe

+0

所以,我想,我只需要祈祷加载时路径正在被UTF-8编码! – Sankalp

0

你应该尝试使用UTF8编码这'''你会得到将是第一个NSString ...在C中每个字符需要1个字节(8位),但UTF16使字符2字节长..所以发生错误