在C++中进行字符串编码转换

最近做了个Jubeat Analyzer的谱面转成Yubiosi谱面的工具。在制作工具的过程中,遇到了一个问题,就是源谱面文件中字符串的编码问题。

Jubeat Analyzer是日本人造的软件,然后它保存的谱面又没有用Unicode,所以在中文操作系统上看就会乱码。对于编码转换问题,其实C++是可以直接支持的。对于一个支持输出宽字符的文件流,把区域设置到japanese就可以了,像这样:

std::locale jpLoc("japanese");
std::wfstream fs("c:\\nanika.txt", std::ios::in);
fs.imbue(jpLoc);

如果问题这么简单就解决的话就好了……

问题是,源文件中不仅仅包含ShiftJIS编码的部分,而且还包含GBK编码的部分。比如某些地方的注释,某些 m="音乐文件名" 的地方。因为如果音乐文件名用的是ShiftJIS,那么在中文系统下就没办法正常读取音乐了。

这种情况下,来一个imbue不能解决问题。因为它读到ShiftJIS不能表示的字符的时候,这个流就给你eof掉了……

既然这样,那我就一行一行读,不同情况不同处理。自己转成Unicode。好吧,怎么转

用MultiByteToWideChar固然简单,但是我想要用C++标准库去做而不是调用系统API。因为你看,wfstream都可以读取ShiftJIS文件到wstring,那么说明内部一定有什么代码实现编码转换的。我想办法调用这编码就行了。 继续阅读在C++中进行字符串编码转换