Linux打开文本文件乱码处理

本笔记记录了从windows拷贝含中文的文本文件到linux中,中文乱码的处理。

原理

windows中的中文默认用GBKGB2312GB18030或其他本地编码,而这些编码集默认不能在linux中被识别。

为什么会有中文编码集。字符编码集的发展可以分为三个阶段

  • ASCII
  • Extended ASCII
  • 字符编码集的国际化

ASCII码使用7bits编码,2^7=128,包括95个可打印字符和33个不可打印字符。很早期计算机使用并不广泛,所以编码128个字符足够。但随着计算机发展,很多功能性符号(加减乘除)和欧洲非英语国家语言中带声调的字符就无法表示了。所以将使用7 bits编码扩展为使用8 bits编码,这就是第一次对ASCII码的扩充,即Extended ASCII

Extended ASCII编码个数从128 增加到255,包括数学运算符,带音标的欧洲字符,表格符和其他。但像中日韩字符还是无法编码。中文编码集有GB2312GBK等,但这些都是本地化的编码,如果国外用户想访问中文网站,而客户端未安装相应的编码集,那么国外用户只会看到乱码。

国际化的字符编码集即Unicode,兼容全球的字符集。它定义了世界通用符号集,用UTF-8UTF-16等实现。一般使用UTF-8编码。

处理方法

第一种方法从源头修改。在windows中编辑中文文本时更改编码格式为UTF-8

第二种方法当不能从源头更改时,比如拷贝的他人的文件。该情况下从接收端即linux系统中更改文件编码格式。
假如有一个从windows拷贝来的中文文本文件original.txt,linux中打开乱码,如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*Ä£·ÂmnistÊýŸÝŒ¯ÖÆ×÷×ÔŒºµÄÊýŸÝŒ¯ŽúÂë*/
ŽúÂëÒ»¹²°üº¬ÈýžöÎÄŒþ
image2BinaryData.h
image2BinaryData.cpp
main.cpp

ÆäÖУºimage2BinaryData.h ºÍ image2BinaryData.cpp ÀïÃ涚ÒåÁËÏà¹ØµÄÀàºÍº¯Êý£¬¿ÉžùŸÝ×ÔŒºµÄÊýŸÝŒ¯×ÔÐÐÐÞžÄ

ʹÓ÷œ·š£º
ÔÚMain.hÎÄŒþÖÐÉèÖúÃ×ÔŒºµÄ͌ƬŽóСÒÔŒ°ÏȹصÄÎÄŒþ·Ÿ¶£¬±àÒëÔËÐÐŒŽ¿É¡£

˵Ã÷£º
ŽËŽúÂëÖ»ÊʺÏËùÓÐ͌ƬŽóСһÖµĻҶÈÍŒÏñ£¬²»ÊʺϲÊÉ«ÍŒÏñ£¬¿É¶ÔÏàӊλÖÃ×ÔÐÐœøÐÐÐޞġ£
͌ƬÃüÃû¹æÔò£º0_00001.jpg£º0±íÊŸ¶Ôӊ͌ƬµÄÄÚÈÝ£¬ŒŽ±êÇ©£»00001±íÊŸ±êǩΪ0µÄ͌ƬÖеÚ1ÕÅ͌Ƭ£¬00002ΪµÚ2ÕÅ͌Ƭ£¬ÒÔŽËÀàÍÆ........
ŽËŽúÂëÊʺÏÀà±ðÊýÉÙÓÚµÈÓÚ10µÄÊýŸÝŒ¯£¬Èç¹ûÀà±ðÊý¶àÓÚ10ÖÖ£¬¿É×ÔÐÐÐޞĎúÂëÖÐÏàÓŠ²¿·Ö

ÔËÐл·Ÿ³£ºwin10 + VS2015 + Opencv3.1.0

首先判断文件具体是用的那种编码

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*模仿mnist数据集制作自己的数据集代码*/
代码一共包含三个文件
image2BinaryData.h
image2BinaryData.cpp
main.cpp

其中:image2BinaryData.h 和 image2BinaryData.cpp 里面定义了相关的类和函数,可根据自己的数据集自行修改

使用方法:
在Main.h文件中设置好自己的图片大小以及先关的文件路径,编译运行即可。

说明:
此代码只适合所有图片大小一致的灰度图像,不适合彩色图像,可对相应位置自行进行修改。
图片命名规则:0_00001.jpg:0表示对应图片的内容,即标签;00001表示标签为0的图片中第1张图片,00002为第2张图片,以此类推........
此代码适合类别数少于等于10的数据集,如果类别数多于10种,可自行修改代码中相应部分

运行环境:win10 + VS2015 + Opencv3.1.0

明白背后原理就有的放矢了,至少知道如何提问从而找到答案。

完成
Linux打开文本文件乱码处理