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 可用的文件编码名.
参考资料
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- StampedLock知识点梳理
- ReentrantReadWriteLock知识点梳理
- 每天都在用String,你真的了解吗?
- [Go] Golang练习项目-快速排序的GO语言实现
- MySQL学习笔记【基础篇】
- 设计模式~缺省适配模式
- 设计模式~合成模式
- mknod | Linux 后门系列
- Nmap NSE 库分析 >>> base64
- 视频远程通话会议EasyRTC通过SSH部署,关闭SSH后进程停止运行如何解决?
- MapReduce之ReduceJoin案例
- ios SDK如何配置
- CopyOnWriteArrayList源码阅读笔记
- python 连接数据库MYSQL
- 知识卡片 CNN 卷积神经网络