Linux/Win之间文件名编码不同(utf-8/gbk)的解决

时间:2024-10-30 08:11:37

背景

本人正在经营一个linux服务器。从windows环境中上传一个本地资源到服务器的时候发现了中文编码的不同导致的乱码。例如:

 

经过scp上传以后,结果是:

理想状态下的文件名应该如第三条所示,然而实际上上传出来的是第四条。

windows中文环境下的文件名字编码格式是gbk,而linux中文名字的编码是utf-8。本来没有太大的问题,自己的脚本和服务器也设置成兼容gbk,在网站上也能显示中文名,但是发现了无法在地址栏上打开中文文件的bug:

网站上可以正常显示。

但是实际点开一个文件就出现了问题。

其原因同理:大概地址栏上的中文字符会被编码成utf-8,但实际上文件名仍是按照gbk编码,导致404 Not Found。这可不行!故本人决定解决这件事。

解决

经过不懈的探索,我在某一篇文章中找到了方法——软件convmv

安装方法:

1.软件包管理器安装:apt-get update   apt-get install convmv或yum install convmv;

2.编译安装:突然找不到原帖了,就直接扔个地址过来:https:///linux/convmv/

使用:

man convmv或convmv --help。但是是英文文档,大致翻译如下:

root@littleye233:/var/www/html# convmv --help

USAGE: convmv [options] FILE(S)    可以是文件名也可以是目录名

常用指令:
-f enc     encoding *from* which should be converted   原文件名字的编码格式
-t enc     encoding *to* which should be converted   转换过来的名字的编码格式
-r         recursively go through directories   递归更改文件名
-i         interactive mode (ask for each action)    需要询问
--exec c   execute command instead of rename (use #1 and #2 and see man page)    执行指令(默认执行的是mv),使用#1 #2作为占位符,表示原文件名和目标名
--list     list all available encodings   列出可用的编码
--nosmart  ignore if files already seem to be UTF-8 and convert if posible    遇到utf-8编码的文件也强制替换
--notest   actually do rename the files     真正执行替换操作(默认不带这个参数只会显示出将要运行的指令,只有带了这个参数才会执行)
--unescape convert%20ugly%20escape%20sequences     将%20转成空格
--help     print this help    显示帮助文档

测试:

由此可以证实默认运行的的确是mv命令。

运行(建议做好备份!)

root@littleye233:~# convmv -f gbk -t utf-8 -r --notest /var/www/html
mv "/var/www/html/media/▒▒ȹ▒-▒▒ԭ▒椤▒▒.mp3"      "/var/www/html/media/君と光-大原ゆい子.mp3"
君と光-大原ゆい子.mp3 exists and differs or --replace option missing - skipped
Skipping, already UTF-8: /var/www/html/media/君と光-大原ゆい子.mp3
mv "/var/www/html/webshare/Python/midi/data/▒▒▒Ĥ⤳▒Έ▒▒▒▒.mid"    "/var/www/html/webshare/Python/midi/data/いつもこの場所で.mid"
mv "/var/www/html/webshare/Python/midi/data/▒▒▒▒ߥ▒▒▒▒▒ʧ.mid"    "/var/www/html/webshare/Python/midi/data/初音ミクの消失.mid"
mv "/var/www/html/webshare/Python/midi/data/▒@ɫ▒▒▒▒▒▒▒`.txt"    "/var/www/html/webshare/Python/midi/data/桜色ダイアリー.txt"
mv "/var/www/html/webshare/Python/midi/data/▒▒ϡ▒▒▒.mid" "/var/www/html/webshare/Python/midi/data/翼は~と.mid"
mv "/var/www/html/webshare/Python/midi/data/▒▒▒▒▒▒▒▒ġ▒᤿▒ޤ▒դ▒~▒▒▒▒! (PurePiano).mid"     "/var/www/html/webshare/Python/midi/data/かくしん的☆めたまるふぉ~ぜっ! (PurePiano).mid"
mv "/var/www/html/webshare/Python/midi/data/▒▒▒▒▒▒▒▒ġ▒᤿▒ޤ▒դ▒~▒▒▒▒!.mid" "/var/www/html/webshare/Python/midi/data/かくしん的☆めたまるふぉ~ぜっ!.mid"
mv "/var/www/html/webshare/Python/midi/data/Again-▒▒▒▒▒▒▒▒.mid" "/var/www/html/webshare/Python/midi/data/Again-アゲイン.mid"
mv "/var/www/html/webshare/Python/midi/data/▒▒▒ʤ▒.mid"  "/var/www/html/webshare/Python/midi/data/光るなら.mid"
mv "/var/www/html/webshare/Python/midi/data/▒@ɫ▒▒▒▒▒▒▒`.mid"    "/var/www/html/webshare/Python/midi/data/桜色ダイアリー.mid"
mv "/var/www/html/webshare/Python/midi/data/▒@ɫ▒▒▒▒▒▒▒`.dms"    "/var/www/html/webshare/Python/midi/data/桜色ダイアリー.dms"
mv "/var/www/html/webshare/Python/midi/data/▒▒▒▒▒▒▒Υ▒▒▒▒`▒ޥ▒▒▒.mid"     "/var/www/html/webshare/Python/midi/data/朝焼けのスターマイン.mid"
mv "/var/www/html/webshare/Python/midi/data/▒▒▒▒▒▒▒Υ▒▒▒▒`▒ޥ▒▒▒.mp3"     "/var/www/html/webshare/Python/midi/data/朝焼けのスターマイン.mp3"
mv "/var/www/html/webshare/Python/midi/data/▒▒▒▒▒▒▒Υ▒▒▒▒`▒ޥ▒▒▒.schematic"       "/var/www/html/webshare/Python/midi/data/朝焼けのスターマイン.schematic"
mv "/var/www/html/webshare/Python/midi/data/ǰǰǰ▒▒.mid"  "/var/www/html/webshare/Python/midi/data/前前前世.mid"
mv "/var/www/html/webshare/Python/midi/data/▒Ƥ▒▒▒▒ʤ▒▒▒.mid"     "/var/www/html/webshare/Python/midi/data/灼け落ちない翼.mid"
mv "/var/www/html/webshare/Python/midi/video_data/▒▒(▒▒▒ʤ▒).dms"        "/var/www/html/webshare/Python/midi/video_data/奏(かなで).dms"
mv "/var/www/html/webshare/Python/midi/video_data/▒▒▒Ĥ⤳▒Έ▒▒▒▒.mid"      "/var/www/html/webshare/Python/midi/video_data/いつもこの場所で.mid"
mv "/var/www/html/webshare/Python/midi/video_data/▒▒ɫ▒▒▒▒▒.dms" "/var/www/html/webshare/Python/midi/video_data/夏色恋花火.dms"
mv "/var/www/html/webshare/Python/midi/video_data/▒▒ɫ▒▒▒▒▒.mid" "/var/www/html/webshare/Python/midi/video_data/夏色恋花火.mid"
mv "/var/www/html/webshare/Python/midi/video_data/▒▒(▒▒▒ʤ▒).mid"        "/var/www/html/webshare/Python/midi/video_data/奏(かなで).mid"
mv "/var/www/html/webshare/Python/ascii/FontMaker/charset/▒▒▒▒ҳ.txt"    "/var/www/html/webshare/Python/ascii/FontMaker/charset/代码页.txt"
mv "/var/www/html/webshare/Python/danmu/output/һ▒ܵ▒▒▒▒ѡ▒▒▒20181231▒▒"    "/var/www/html/webshare/Python/danmu/output/一周的朋友。(20181231)"
mv "/var/www/html/webshare/Python/take_number_emulate/ȡ▒▒▒▒▒▒ģ▒▒.py"    "/var/www/html/webshare/Python/take_number_emulate/取数问题模拟.py"
mv "/var/www/html/webshare/Python/boardgame/doubt_card/example/client/PS▒▒▒▒Ա▒▒▒ա▒▒▒▒▒▒▒▒▒▒▒▒▒▒˵▒▒▒▒ϡ▒▒▒▒▒"      "/var/www/html/webshare/Python/boardgame/doubt_card/example/client/PS:人员按照《我与质疑与男人的尊严》设置"
Ready! I converted 25 files in 1 seconds.
不贴图片了,截图好累QAQ

最终结果:

从结果上来看的确做了更改。

点开原先的网页,出现下载通道,说明的确200了。

---全文完---