我有一个需要传递由char*指向的UTF-8字符串的函数,但我只有指向单字节字符串的char指针。在C++中,如何将该字符串转换为UTF-8编码?是否有可用的代码可以实现这一点? 谢谢!
我有一个需要传递由char*指向的UTF-8字符串的函数,但我只有指向单字节字符串的char指针。在C++中,如何将该字符串转换为UTF-8编码?是否有可用的代码可以实现这一点? 谢谢!
iconv_open
)时,需要传递from和to编码。如果您将空字符串作为from传递,则会从系统上使用的区域设置进行转换,这应该与文件系统匹配。CP_ACP
作为代码页进行传递。但是,在Windows上,您可以直接调用Unicode版本的函数以立即获取Unicode,然后使用WideCharToMultiByte和CP_UTF8
进行转换为UTF-8。readdir
获得字符串。我不太确定,但我认为 readdir
将按文件系统存储的方式返回文件名。对于 FAT/FAT32:vfat
Linux内核模块来访问FAT32分区,您应该可以从readdir
中获取长文件名(除非文件只有8.3个字符的名称)。 FAT32在内部以UTF-16格式存储长文件名。 vfat
驱动程序将把它们转换为由iocharset=
挂载参数给定的编码(默认为系统默认编码,我认为)。codepage
和iocharset
(请参见http://linux.die.net/man/8/mount),以便在FAT32卷上正确显示文件名。尝试进行挂载,使得Linux控制台中的文件名显示正确,然后继续操作。这里还有一些更多的解释:http://www.nslu2-linux.org/wiki/HowTo/MountFATFileSystems。我猜测1字节字符串的最高位被设置了,因此你要传递给它的函数需要传递超过1字节。
首先,以十六进制打印字符串。
例如:
unsigned char* str = "your string";
for (int i = 0; i < strlen(str); i++)
printf("[%02x]", str[i]);
现在请仔细阅读Wikipedia上关于UTF8编码的文章,其中详细解释了它的工作原理。
http://en.wikipedia.org/wiki/UTF-8
UTF-8是一种可变长度编码方式,每个字符可以占据1到4个字节。
因此,将十六进制转换成二进制并查看代码点。例如,如果第一个字节以二进制的11110开头,则期望的字符串由4个字节组成。由于ASCII是7位0-127,最高位始终为零,因此应该只有一个字节。顺便说一句,在UTF8字符串的宽字符中,紧随第一个字节后面的字节将以“10...”开头,这些是续补码……这就是您的函数报错的原因所在,即期望的续补码缺失了。因此,该字符串并不完全符合ASCII规范,正如您原先认为的那样。
您可以使用像iconv这样的工具进行转换,或者使用这个库文件:http://utfcpp.sourceforge.net/