不同语言系统下的文件名乱码问题

这几天又碰上个事儿,有位小伙伴向我咨询关于文件乱码的问题。

事情起因是他的一个日本客户公司发给他一个压缩包,虽然可以正常解压缩,可是里面的文件名称均显示为乱码。

由于文件较多,无法从文件名上直接识别分类,导致必须要一个一个手动打开文件,然后再通过确认内容来使用和整理文件,显得极为麻烦。

平时都是一两个文件通过邮件发送过来,也不存在乱码的情况,可是这次资料太多,邮件又不允许一次性发送那么多文件,再让对方重新发送也不太现实。

现在太君要得急,因此发消息来询问我有没有什么好的解决方法。


计算机系统的乱码问题可以说是由来已久,基本上都是由于系统语言不一致文字解码错乱导致的。

现如今的操作系统已经发展得非常高级了,各个不同语言平台的系统可以做到自动转换编码以达到减少乱码的目的,似乎我们也是有些年头没有遇到乱码问题了。

我清楚地记得我上一次遇到乱码的时候,还是学生时代玩外文游戏的时候。

当时有很多软件和游戏都是繁体或日文的,针对乱码情况那时有很多所谓的修正翻译软件,比如南极星之类的。


那么如今为什么还会遇到乱码的情况呢?

话说回来,我个人对于这乱码问题也是一知半解,了解不深,于是我又重新找了些资料粗略地啃了一遍。

啃完之后,实话实说,我感觉有点咯牙,味道不是太好!

不过对于编码那些事儿,在这儿我不太想说得太啰嗦,因为这涉及到非常庞大的知识内容库(主要是我也不懂)。

还好就目前对于解决我们眼前的问题而言,我们只需知道:

  1. 中文通常用的是 GBKGB2312 编码,而日文通常用的是 Shift-JIS 编码。
  2. 不管哪种语言,通用的编码方式都是 Unicode
  3. 不管你是什么码,都可以通过转成 Unicode 再转成正常显示的码。


编码转换的算法是复杂的,它对小白并不友好,甚至对于健康具有很大的威胁,因此我们绕开算法直接谈应用。


使用浏览器转换编码

这个方法简单易上手,灰常适合新手小白(就像我),同时适用于所需转换文字不太多的场景。


首先,将乱码复制并保存到一个文本文件中(比如用 Windows 的记事本编辑都可以)。


其次,打开浏览器,从浏览器中打开刚才那个新建的文本文件,此时我们能看到文件的内容都是些乱码。


再次,点击菜单 查看 > 编码 > 日语(Shift-JIS) ,这时正常的日文就显示出来了。

当然了,如果你的那些文字不是日语,那你就要选择其他的编码来让它正常显示出来。


这种方法非常简单,而且随便什么现代使用的浏览器都能做到,因为浏览器都带有编码转码功能。

不过我们也看到了,这个只能一个一个都转,要是文字多一点儿就忙不过来了。

量多的情况下必须将大量的乱码复制到文本文件中,再将其用浏览器打开后转换。


很显然,这种方法临时用用还可以,可是就算自己是小白,但我还是个小懒怎么办?

那么,除了浏览器,还有其他方法吗?


使用工具软件

互联网如此发达的今天,网上早已有了很多工具软件可以实现乱码转码的效果,不过好用的却不多。

其中有一款名曰 ConvertZ 的软件不仅免费,而且的确非常好用,通常涉及到的编码也比较全,只是作者已经不再更新了。

这款软件可以做到文字转换和文件名转换两种功能,基本上够用,功能强大,小白利器。


关于这款软件如何使用,网上有很多教程,软件本身也比较容易使用,本文不再赘述。

而本文的重点则是接下来的内容,我们需要思考,自己如何实际地去处理乱码问题,而不是单单使用别人的工具。


使用 VB 代码来修正乱码

我在网上看到一篇大神的文章,描述了关于 VB6 内置的内码转换功能。

这篇文章给了我很大的启发,我们完全可以用 VB6 自带的功能来实现乱码修正功能。

那么它的原理是什么呢?我总结如下。


我们在平时使用 VB 时,可能并不知道它会自说自划地做些小动作。

哦,怎么说?

比如你给它一个字符串,实际上它会根据本地缺省语言的对应关系,先将这个字符串转换成 Unicode 编码,经过一系列的加工操作(程序执行任务),然后在输出的时候再从 Unicode 转换回本地编码,所以你看到的还是之前输入的正常的字符串文字。

整个过程对于用户而言是透明的,它的内部如何运作我们不需要关心,但这个事情是客观存在的,有自动转码这个事儿。

参考文章:http://www.kingteaching.com/school/vb/articles/338


好,既然 VB 有这么个秘密功能,那它肯定会有相应的功能函数吧?

没错!VB 内部的确有一个自带的函数,名字叫作 strConv ,通常我们时不时地都会用到它,用途嘛多半是专门拿它来转码的,比如转成 Unicode

strConv(string, conversion, LCID)
 
  • 第一个参数 string ,自然是我们输入的字符串了。

  • 第二个参数 conversion ,是转换方式,也就是你想将字符串转成啥样子,常用的有两个,VBFromUnicodeVBUnicode

    看这两个的名字也能猜出来吧,前者是从 Unicode 转换到什么,后者则是直接转换成 Unicode

  • 第三个参数 LCID ,这个东东可是本文的重点,它是指本地缺省编码的代号,中文有中文代号,日文有日文代号。


这第三个参数 LCID 很是个迷,因为它和一些常见的编码代号不太一样,比如 html 的中文编码是 cp936 ,这就容易造成理解的困难 。

还好我在网上找到了正确的参考表,链接如下。

https://www.vbsedit.com/html/882ca1eb-81b6-4a73-839d-154c6440bf70.asp
 


对照上面的表格,我们很容易就可以查找到,中文的编码是 0x0804 ,而日文的编码是 0x0411

接下来我们就可以利用 strConv 函数,以及 LCID 编码来实现乱码的编码修正转换了。


参考代码如下:

Dim byt() as Byte

' 字符串装入时已经被VB以中文为基准自动转换成了Unicode编码
byt = 'sysadm.cc傊傛偆偙偦両'

' 先将字符串由Unicode编码以中文GB2312编码方式转换回来,LCID=0x0804
byt = StrConv(byt, vbFromUnicode, &H804)

' 再将字符串由GB2312编码转换成以日文Shift-JIS编码为基准的Unicode形式,LCID=0x0411
byt = StrConv(byt, vbUnicode, &H411)
 


其基本原理是,字符串被装入内存时,VB 做了小手脚,用(本地)中文编码将它自行转成了 Unicode

因此,我们应该先将它从 Unicode 转换回来,转换回来的编码自然要用中文 0x0804

最后再用日文编码 0x0411 转成 Unicode 形式,我们就可以看明白写的是啥了。


这个转来转去的过程比较烧脑,小伙伴们尝试尽力理解就行。

基于这个原理,我干脆用 VB 写了一个程序。


自制日文乱码转换器

基于前面所述原理,再仿照大神们的工具软件,我自己撸了个简易的自制乱码转换器。

共有三个部分,分别是日文乱码字符串转换、文件内容乱码转换和批量修正乱码文件名。


第一部分,输入乱码文字,点击 转换文字 即可输出正常可读的日文字符串。


第二部分,双击源文件文本框,选择内容乱码的文件(比如 Source.txt ),然后点击 转换文件

在程序当前目录中会生成 Result.txt 文件,即为转换后的文件。


第三部分,输入文件夹路径后点击搜索文件,然后再批量转换,目标文件夹内的文件夹及文件的名称均转换成正常文字。


程序及示例文件本地下载。

网管小贾的日文乱码转换器.7z(94K)

下载链接:https://pan.baidu.com/s/1EKeT0xm89EPjvnk2ii343g

提取码:


输入密码,继续阅读



扫码关注微信公众号,回复文章ID免费获取密码


<文章ID:000875>


关于压缩文件中的乱码

就像文章开头描述的那样,我们收到的乱码文件往往是压缩文件的形式。

这里面其实是有个坑的,简单地说就是,如果你用 zip 格式去压缩打包文件的话,基本上就会出现乱码。

而用 7z 格式压缩就不会乱码,其原因是 7z 格式打包时会自动转码。

7z 这个功能应该说是非常高级,除了压缩高效与否之外,也是 7zzip 两种不同格式的区别之一。

所以说罗,今后大家尽量用 7z 的格式来打包分发文件给自己的伙伴吧,这样可以有效避免文件乱码带来的困扰。


写在最后

乱码问题伴随着电脑系统的更新和强大,似乎离我们渐渐远去。

不过这只是个表象,因为它的本质仍然是计算机背后的编码知识,而编码知识恰恰是计算机的基础,因此只有熟悉编码知识才能透过乱码表象看清背后的本质真相。

虽然计算机编码知识显得复杂晦涩,但如果你能多少了解一些,那么至少使用现代的高级编程语言还是能处理好所遇到的一些小问题的。

由于我水平有限,时间也较紧,草草做了这么一个自制程序。

如果小伙伴们有时间有精力,还可以尝试做些功能的扩展,比如日文系统中转换中文的乱码,亦或者是转换一些其他语言的乱码等等。

我相信除了古老的 VB 外,还有很多编程语言都可以轻易实现以上功能。

还是那句话,懂得原理比较重要,只要你掌握原理,编程工具才能发挥它的最大作用。


扫码关注@网管小贾,阅读更多

网管小贾的博客 / www.sysadm.cc



提交评论

安全码
刷新

© 2020-present 网管小贾 | 微信公众号 @网管小贾
许可协议:CC-BY-NC 4.0 | 转载文章请注明作者出处及相关链接