2019.06.26 折腾宽字符和编码

探讨使用FFmpeg处理含有中文文件名的问题,包括乱码显示、宽字符使用及编码解决方案,强调版本管理和软件测试的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  今天有个需求,让人不需要脑子得把轴和视频压在一起,本来是要求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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值