标题: 批量转换GB2312的TXT到UTF-8格式 创建: 2018-12-20 16:28 更新: 2018-12-21 12:24 链接: https://scz.617.cn/unix/201812201628.txt 青衣十三楼最初就是简单分享内容,并不在意传播途径,我使用GB2312编码的TXT, 回车换行使用*nix格式,即只有\n没有\r\n。这种设置对我个人来说,从未带来困挠, 办公用机是Windows,一般用UltraEdit打开TXT,用Firefox、Chrome、IE访问URL或 打开HTML。在我的Android手机上通过微博短链接打开URL也很正常。 但是,多年来断续有人报怨"青衣十三楼"的TXT乱码。乱码无非就是浏览器文字编码 格式不匹配呗。 最近想了想,还是方便一下围观群众,批量转换GB2312的TXT到UTF-8格式,虽然没看 出有啥特别好处。肯定有很多现成办法干这事,懒得找最优解,瞎对付着弄弄。 -------------------------------------------------------------------------- #!/bin/sh # Usage: ./convert.sh if [ $# -ne 1 ] ; then echo "Usage: ${0} " exit 1 fi if [ ! -f ${1} ] ; then echo "Checking your " exit 1 fi while read LINE do if [ "${LINE}" == "" ] then continue fi echo "${LINE}" iconv -f GB2312 -t UTF-8 "${LINE}" | unix2dos -r > "${LINE}.tmp" mv "${LINE}.tmp" "${LINE}" done < "${1}" -------------------------------------------------------------------------- filelist中每行一个文件名,对应待转换TXT、HTML。convert.sh从filelist中逐行 读取待转换文件名,调用iconv从GB2312转成UTF-8格式,再用unix2dos转成Windows 换行格式,方便在Windows上(notepad)双击打开时人类可读。 iconv转换失败时,会在stderr上输出点啥,我在调用iconv之前先echo了待转文件名, 当某个文件因故转换失败时一眼就能看出是哪个,正经点的办法是检查"$?",我这不 图省事么。 用iconv转换时,意外发现几处错别字,比如"祼",原意是想输入"裸"。我用五笔, 有时一走神可能就去敲py而不是pu,而这两个字在屏幕上如此相似,肉眼很难发现敲 错了字。我这个iconv不知怎的,碰上"祼"时会转换失败,直接截断,后续内容丢失, 倒是方便定位出问题的汉字。可能"祼"不在GB2312字符集里,我又没指定-cs参数, 所以直接报错退出。类似的还有一些,都是靠iconv转换失败找出来的。 给unix2dos指定: -r, --remove-bom Remove Byte Order Mark (BOM). Do not write a BOM in the output file 当时觉得没有BOM也没啥,反正Windows认没有BOM的UTF-8。结果后来出幺蛾子。首先, Windows中的浏览器直接访问单个TXT的URL时不一定自动识别成Unicode,很可能使用 "简体中文",乱码,只能手工调整编码格式,或者从index.html点过去。其次,单个 TXT的URL在手机微信、微博里打开时全是乱码,没法手工设置客户端使用哪种编码格 式。搞得还不如过去的GB2312,为了让别人不乱码,自己先乱码。bluerust建议加上 BOM,我试了试,对Windows客户端及手机客户端有效,据说对*nix客户端有副作用, 未细究。 -------------------------------------------------------------------------- #!/bin/sh # Usage: ./addbom.sh if [ $# -ne 1 ] ; then echo "Usage: ${0} " exit 1 fi if [ ! -f ${1} ] ; then echo "Checking your " exit 1 fi BOMHead=$(mktemp -p /tmp "BOMHead.$$_${RANDOM}_XXXXXXXXXX") printf "\xef\xbb\xbf" > "${BOMHead}" while read LINE do if [ "${LINE}" == "" ] then continue fi echo "${LINE}" cat "${BOMHead}" "${LINE}" > "${LINE}.tmp" mv "${LINE}.tmp" "${LINE}" done < "${1}" rm "${BOMHead}" -------------------------------------------------------------------------- addbom.sh在裸的UTF-8文件首部增加"EF BB BF"。两个脚本完全可以合一起,我就是 写写当时怎么瞎弄的,未合。 find /tmp/webframe -type f -name "*.txt" > /tmp/filelist /tmp/convert.sh /tmp/filelist /tmp/addbom.sh /tmp/filelist find /tmp/webframe -type f -name "*.html" > /tmp/filelist /tmp/convert.sh /tmp/filelist /tmp/addbom.sh /tmp/filelist 对于HTML,得多干一件事: 把charset从gb2312改成utf-8。 更新: https://scz.617.cn/offline/scz_offline.7z 现在这个离线包及在线网页全部是带BOM的UTF-8格式,用\r\n回车换行。再有乱码我 也不管,就这样。