今天有个需求,让人不需要脑子得把轴和视频压在一起,本来是要求bat的,但是我本来都想win10之后再也不碰这玩意了,而且之前已经手痒捣鼓了一个FFmpeg的批量转换程序,感觉改改就能用。
然而不出所料得出现了问题,测试后发现只对全英文文件起效,只要含有中文就无法显示甚至无法使用system调用,尝试查询使用宽字符string解决,意外的发现wchar和char几乎无法混杂使用,分别有成套的(w)cout、(w)string,甚至于(w)system(),并且需要setlocale()配合。(缺省的ANSI C编码下的cout可以直接输出中文,而wcout不行)
阅读代码时学习了零散的知识:LPC(W)STR = Long(兼容Win16) Pointer Const (Wide) String、_T宏决定是否启用Unicode、psz = Pointer to String with Zero at end、加深了一点对小驼峰命名的理解。
写博客的时候尝试复现了几次错误,较为辛苦且少有成功,感受到软件测试的艰难和版本管理的重要性,这个小破程序不想传GitHub也应该本地建个仓库commit的。
最后在多次测试和搜寻资料中发现改变乱码的只是setLocale函数,并不需要宽字符,理由是GBK编码向下兼容ANSI。
复现的Bug有:未设置locale普通和宽字符均无法显示文件名,locale设置为NULL不显示文件名。未复现的Bug有:FFmpeg提示unable to find a suitable output format,文件名后缀的第一位被视作乱码的一部分,调整字符串合并(加法)的代码后解决,未能复现。
FFmpeg使用Unicode编码,因此即使文件名正确,编码过程中显示的仍然是乱码,可以考虑将GBK转化为Unicode再使用locale(“Unicode”)输出进行尝试。
https://blog.youkuaiyun.com/jihengshan/article/details/44958315
https://www.cnblogs.com/jmliao/p/6031818.html
https://blog.youkuaiyun.com/zhengudaoer/article/details/79794634
https://www.cnblogs.com/zhugaopeng/p/9801136.html
https://blog.youkuaiyun.com/liu180230/article/details/8978461
https://www.cnblogs.com/toSeek/archive/2013/04/09/3011422.html