本笔记记录了从windows拷贝含中文的文本文件到linux中,中文乱码的处理。
原理
windows中的中文默认用GBK
,GB2312
,GB18030
或其他本地编码,而这些编码集默认不能在linux中被识别。
为什么会有中文编码集。字符编码集的发展可以分为三个阶段
- ASCII
- Extended ASCII
- 字符编码集的国际化
ASCII
码使用7bits编码,2^7=128
,包括95个可打印字符和33个不可打印字符。很早期计算机使用并不广泛,所以编码128个字符足够。但随着计算机发展,很多功能性符号(加减乘除)和欧洲非英语国家语言中带声调的字符就无法表示了。所以将使用7 bits编码扩展为使用8 bits编码,这就是第一次对ASCII
码的扩充,即Extended ASCII
。
Extended ASCII
编码个数从128 增加到255,包括数学运算符,带音标的欧洲字符,表格符和其他。但像中日韩字符还是无法编码。中文编码集有GB2312
,GBK
等,但这些都是本地化的编码,如果国外用户想访问中文网站,而客户端未安装相应的编码集,那么国外用户只会看到乱码。
国际化的字符编码集即Unicode
,兼容全球的字符集。它定义了世界通用符号集,用UTF-8
,UTF-16
等实现。一般使用UTF-8
编码。
处理方法
第一种方法从源头修改。在windows中编辑中文文本时更改编码格式为UTF-8
。
第二种方法当不能从源头更改时,比如拷贝的他人的文件。该情况下从接收端即linux系统中更改文件编码格式。
假如有一个从windows拷贝来的中文文本文件original.txt
,linux中打开乱码,如
1 | /*Ä£·ÂmnistÊýŸÝŒ¯ÖÆ×÷×ÔŒºµÄÊýŸÝŒ¯ŽúÂë*/ |
首先判断文件具体是用的那种编码
1 | $ chardet3 original.txt |
返回如下,表示有99%的信心认为original.txt
是用GB2312
编码的。
1 | original.txt: GB2312 with confidence 0.99 |
然后用如下命令将编码格式从GB2312
变到UTF-8
1 | $ iconv -f GB2312 -t utf-8 original.txt -o file_utf-8.txt |
新的文件file_utf-8.txt
会被创建。Linux中打开它
1 | /*模仿mnist数据集制作自己的数据集代码*/ |
明白背后原理就有的放矢了,至少知道如何提问从而找到答案。
完成
Linux打开文本文件乱码处理