Linux下文件字符编码格式检测和转换
目前多数情况下, 我们遇到的非英文字符文件都是使用UTF-8编码的, 这时一般我们查看这些文件的内容都不会有问题. 不过有时, 我们有可能会遇到非UTF-8编码的文件, 比如中文的GBK编码, 或者俄语的CP1251编码. 而文本文件一般不带有自身编码格式的信息, 这就给我们处理带来很多麻烦. 本文介绍几个Linux命令来检测和转换文本文件的编码格式.
检测文件编码格式
enca 命令名是Extremely Naive Charset Analyser的缩写, 从它这个卖萌的名字来看, 应该可以用来检测文件的编码格式.
安装 enca
在Ubuntu下, 可以使用以下命令安装
apt-get install enca
使用方式
它最简单的使用方式如下:
# enca test.txt
Simplified Chinese National Standard; GB2312
上面的test.txt是一个含有中文GB2312编码的文本文件. 根据 enca 的文档, 当我们运气好的时候, 就可以按照上面不添加任何额外参数的情况下, 检测出文件的编码格式. 而就我的经验来看, Linux的语言设置是一个影响运气的因素. 上面的操作在默认语言为中文的Linux中, 行为就会如同上面给出的结果正确的检测出文件的中文编码格式. 而当LInux默认为英文时, 运气就不会那么好了.
# enca test.txt
enca: Cannot determine (or understand) your language preferences.
Please use `-L language', or `-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run `enca --list languages' to get a list of supported languages.
根据 enca 的错误提示, 我们需要给它提供-L参数来限定需要检测的文件语言.
首先, 我们需要看看当前系统下 enca 支持的语言和对应的编码类型:
# enca --list languages
belarusian: CP1251 IBM866 ISO-8859-5 KOI8-UNI maccyr IBM855 KOI8-U
bulgarian: CP1251 ISO-8859-5 IBM855 maccyr ECMA-113
czech: ISO-8859-2 CP1250 IBM852 KEYBCS2 macce KOI-8_CS_2 CORK
estonian: ISO-8859-4 CP1257 IBM775 ISO-8859-13 macce baltic
croatian: CP1250 ISO-8859-2 IBM852 macce CORK
hungarian: ISO-8859-2 CP1250 IBM852 macce CORK
lithuanian: CP1257 ISO-8859-4 IBM775 ISO-8859-13 macce baltic
latvian: CP1257 ISO-8859-4 IBM775 ISO-8859-13 macce baltic
polish: ISO-8859-2 CP1250 IBM852 macce ISO-8859-13 ISO-8859-16 baltic CORK
russian: KOI8-R CP1251 ISO-8859-5 IBM866 maccyr
slovak: CP1250 ISO-8859-2 IBM852 KEYBCS2 macce KOI-8_CS_2 CORK
slovene: ISO-8859-2 CP1250 IBM852 macce CORK
ukrainian: CP1251 IBM855 ISO-8859-5 CP1125 KOI8-U maccyr
chinese: GBK BIG5 HZ
none:
在我的测试环境中, enca 支持以上的语言和编码. 可以看到中文是chinese: GBK BIG5 HZ, 于是, 我们可以尝试以下参数组合:
# enca -L chinese test.txt
Simplified Chinese National Standard; GB2312
这时, enca 给出了一个明确的答案.
默认情况下, enca 给出的是人可读的编码格式名, 比如上面的 Simplified Chinese National Standard; GB2312. 而有时, 我们会希望给出的结果给其他命令或者程序使用, 比如, 我们希望结合 iconv 命令来转换文件编码, 可以添加-i来让 enca 给出相应的程序可用编码名:
# enca -i -L chinese test.txt
GBK
转换文件编码格式
在知道了文件的正确编码格式之后, 我们往往会希望将文件转换为UTF8之类常用或者系统默认支持的编码格式, 以便后续进一步处理.
使用 enca 进行转换
当我们给 enca 命令添加-x参数时, enca 命令就会将文件转换为-x参数指定的编码格式:
# enca -L chinese test.txt
Simplified Chinese National Standard; GB2312
# enca -x UTF8 -L chinese test.txt
# enca -L chinese test.txt
Universal transformation format 8 bits; UTF-8
可以看到, 在执行enca -x UTF8 -L chinese test.txt命令后, 文件 test.txt 的编码从GB2312转换为了UTF8. 注意 , enca 命令会将源文件覆盖, 所以使用这个命令时, 要注意备份源文件.
使用 iconv 进行转换
iconv 是*nix系统里的转换字符编码的标准命令和API. 如果我们希望将一个GBK编码的文件转换为UTF8编码, 可以以以下方式使用 iconv 命令:
# iconv -f GBK -t UTF8 test.txt
其中test.txt是要被转换的文件, -f GBK参数表示源文件的编码是GBK, -t UTF8则表示要转换的目标编码. 执行以上命令后, iconv 命令会将转换后的文件内容打印到标准输出.
如果希望将转换后的内容保存到文件, 可以添加-o参数:
# iconv -f GBK -t UTF8 -o test_converted.txt test.txt
这个命令就会将转换后的内容自动保存到 test_converted.txt 文件.
通过 iconv -l则可以查看所有的字符集名称. 前文也提到enca -i则可以用来输出 iconv 可用的文件编码名.
参考资料
Linux下文件字符编码格式检测和转换的更多相关文章
- linux下文件编码的查看与转换(转)
通常来说,Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8,所以Linux下打开windows的文件会有乱码的情况.另外,有时要将文件进行编码转换,如将简体中文转 ...
- linux下的字符界面和图形界面转换
linux下的字符界面和图形界面转换 linux下有六个虚拟终端按键ctrl+alt+F1-F6可以进入相应的虚拟终端永久的话修改/etc/inittab将id:5:initdefault:中的5改成 ...
- linux下文件编码格式转换方法(gb18030/utf-8)
文章转载自:http://www.firekyrin.com/archives/249.html linux下文件编码格式转换方法(gb18030/utf-8) 在Linux做开发或者系统管理遇到乱 ...
- linux查看文件的编码格式的方法 set fileencoding PYTHON
linux查看文件的编码格式的方法 set fileencoding 乱码原因:因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件.但是windows的本地默认编码是cp93 ...
- linux下文件结束符
linux下文件结束符,我试过了所有的linux,发现其文件的结束符都是以0a即LF结束的,这个是操作系统规定的,windows下是\r\n符结束,希望可以帮助大家. -------------转:来 ...
- Linux下文件的权限
一.Linux下查看文件属性 命令为: [root@localhost ~]# ls -al 结果: ls是『list』的意思,重点在显示文件的文件名与相关属性.而选项『-al』则表示列出所有的文件详 ...
- Windows与Linux下文件操作监控的实现
一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场 ...
- Linux下Rootkit的另类检测
Linux下Rootkit的另类检测 当黑客获取管理员权限时,首先是抹掉入侵系统的相关记录,并且隐藏自己的行踪,要实现这一目的最常用的方法就是使用Rootkits,简单的说,Rootkits是一种经 ...
- Linux下文件搜索、查找、查看命令
Linux下文件搜索.查找.查看命令 1.最强大的搜索命令:find 查找各种文件的命令 2.在文件资料中查找文件:locate 3.搜索命令所在的目录及别名信息:which 4.搜索命令所在的目录及 ...
随机推荐
- github使用手册
1.git init 2.git add README.md (增加文件夹/文件:git add dir/files) 3.git commit -m "注释内容” 4.git push - ...
- Android学习——ViewPager的使用(二)
这一节介绍使用FragmentPagerAdapter适配器,来加载Fragment对象. 数据源 加载Fragment对象时,数据源自然来自Fragment,与View类似,依旧使用List来存放数 ...
- javascript面向对象的写法01
类和对象 其他面向对象的语言类的语法是内置的,自然而然的事.javascript中有对象,但没有类的语法,类的实现需要模拟出来. 只需要把对象想成一个容器,里面存放一些属性或方法,把类想象成一个对象的 ...
- java面试题----String、StringBuffer、StringBudder区别
面试题1 - 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好? 面试题2 - 请说出下面程序的输出. class ...
- 微软技术大会直播倒计时7天 | 地球上的IT咖们,正在慢慢向北京聚集
去年,一句歌词火了:“我在北方的寒夜里,四季如春.”足以见得,北京的冬天,是可以把人冻蒙圈儿的. 然而有一群人,却正在慢慢靠近这样寒冷的北京,7 天后,他们将齐聚在北京. 他们来这里干什么?又是来见谁 ...
- 配置环境变量时,cmd下运行java -version,报错:找不到或无法加载主类 -version
这个方面适用于报错为:java 找不到或无法加载主类,一般是找不到类的路径,问题出在CLASSPATH环境变量上,当然这是大多数.大概率的出错点 不排除根据个人情况不况,所以想起来伟大领袖毛主席的话: ...
- 谣言粉碎机 - 极短时间内发送两个Odata request,前一个会自动被cancel掉?
背景 有时我们能在Chrome开发者工具的Network tab里观察到SAP UI5应用会发出某些状态为"取消"的OData请求.如下图第五个请求. 之前有一种似是而非的说法:极 ...
- IOS ASI 请求服务器 总结
一.发送请求的2个对象 1.发送GET请求:ASIHttpRequest 2.发送POST请求:ASIFormDataRequest* 设置参数// 同一个key只对应1个参数值,适用于普通“单值参数 ...
- arcgis for javascript ArcGISDynamicMapServiceLayer 过滤图层点
记录下过滤 ArcGISDynamicMapServiceLayer 图层服务的方法 function filterArcGISDynamicMapServiceLayer(){ map.graphi ...
- Android(java)学习笔记9:JDK5之后的Lock锁的概述和使用
1. Lock锁的概述: java.util.concurrent.locks,接口Lock 首先Lock是一个接口,Lock实现提供了比使用synchronized方法 和 同步代码块更为广泛的锁定 ...