在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++中进行字符串编码转换

终于把Windows Live Writer装到电脑上去了

以前用的它自带那个安装包来装,装了半死总是给我出错,装不上。

今天用磁盘碎片整理软件整理碎片的时候,猛然发现它移动的文件里面有一个叫做writer.msi的,而且在Windows Live文件夹下。赶快去顺着它显示的路径找找,找到了C:\Program Files\Common Files\Windows Live\.cache里面,有好多文件夹,里面有writer.msi文件还有writerlang.msi(一看就是语言包吧?)。装上去以后发现没可执行程序……好吧,看来刚才找到的那个看起来文件名有点相关的writerprod.msi和writerprodlang.msi也是有关系的。装,然后开始菜单的Windows Live里面终于出现Writer了。

现在我也可以用它来写日志了,比如这篇就是XD

搞死人的管道HANDLE,搞死人的继承

测试昨天的代码的时候,又遇到了问题。把整个处理流程又加长之后,其中有一个进程的输入和输出都被重定向了。因为昨天测试的时候都是中途强行停止,现在想要正常停止,自然就是把连接自己和子进程StdInput的管道HANDLE关闭,结束送数据。但是我关掉管道输入端的HANDLE以后,子进程却还在傻傻等待数据,也不退出。 继续阅读搞死人的管道HANDLE,搞死人的继承

使用Windows的匿名管道和Boost.Iostreams

因为Boost.Iostreams提供了封装Windows的Handle的支持,利用这个可以简化匿名管道的操作。我想要达到的目标,先实现这样一个简单的命令行:

ffmpeg -i c:\1.mp3 -acodec pcm_s16le -ac 2 -ar 44100 -f s16le - | oggenc2 -o c:\1.ogg -q 1 -B 16 -C 2 -R 44100 -

功能很简单,就是把一个mp3文件转换成ogg文件而已。然而要达到这个目的,耗了不少精力…… 继续阅读使用Windows的匿名管道和Boost.Iostreams

自制IIDX手台

暑假中8月初的时候,去上海玩了一次。在那边第一次见到了IIDX的街机。因为以前在电脑上玩过加载BMS的音乐游戏,所以见到那街机的时候,很想玩玩看。那个时候一个大触手在那边玩,作为旁观者感觉特别可怕(汗

我看那控制器挺简单的,就是7个按键加一个转盘而已,应该不会太贵吧,于是就想弄个那样的手柄自己在家里对着BMS的游戏玩。回来以后就上淘宝搜了一下,卧槽这东西居然要一千块。好贵好贵好贵><我又不是专业玩这个的,只是业余娱乐想随便玩玩而已,为此去花那么多钱买个控制器回来玩也实在不值得。然后就想要不用手柄改造一个出来,就改为搜索长方形按键,果断搜出了很多。家里有去年吃月饼剩下的金属盒,上面挖洞装上按键的话大概能成吧……至于转盘,能行或者不能行,好做就做不好做就算了。 继续阅读自制IIDX手台