免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5761 | 回复: 6
打印 上一主题 下一主题

[文本处理] 中文文本编码转换求助 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-18 15:01 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2014-10-18 16:18 编辑

大家好!
我有一个中文文本编码转换的问题向大家请教。
有一个从Linux的MySQL数据库导出来的csv文件,MySQL编码应该是gbk,反正在Linux环境下用more命令直接可以看到中文不乱码。
  1. [root@shinagawa test]# file $file
  2. data_in_chinese.csv: Non-ISO extended-ASCII text, with CRLF line terminators
  3. [root@shinagawa test]#
复制代码
把这个csv文件下载到本地电脑上以后,用notepad打开也可以看到中文不乱码,但是如果用excel直接打开中文会乱码。
这个时候用notepad打开这个csv文件,选择另存为,可以看到原来的编码方式为ANSI,改成UTF-8以后保存为另外一个csv文件,
再用excel打开这个csv文件就可以看到中文不乱码了。

但是我希望能在Linux下用命令直接生成或者转换成可以用excel直接打开不乱码的csv文件,我试了用iconv命令,选择从GBK或者
GB2312或者ASCII转换到UTF-8,但是用excel打开生成的文件以后中文还是乱码。
于是,索性我用以下命令尝试把所有iconv支持的编码方式都试了一遍:
  1. file=data_in_chinese.csv
  2. for c in $(iconv --list); do iconv -f ${c%%/*} -t UTF8 $file -o ${file%.*}_from_${c%%/*}_to_utf-8.${file#*.};done
复制代码
然后再刨去那些转换后文件长度比原文件还小的文件(转换中途失败的):
  1. org_file_length=$(ls -l $file|awk '{print$5}')
  2. ls -l |awk -v l=$org_file_length '{if($5<l)print$9}'|xargs -r rm -f
复制代码
最后得到507个csv文件。
然后我把这507个文件全部下载到本地,用excel打开,却发现所有的这些csv文件中中文依然是乱码的。
那么也就是说用iconv没有办法达到象Windows下用notepad进行ANSI转UTF-8的效果吗?
请大家帮忙想想办法!谢谢了!

论坛徽章:
9
2015亚冠之大阪钢巴
日期:2015-06-04 11:47:30丑牛
日期:2015-01-22 15:49:26巳蛇
日期:2015-01-22 10:11:18巨蟹座
日期:2014-11-20 10:55:03天蝎座
日期:2014-11-16 22:10:26处女座
日期:2014-11-16 11:01:10申猴
日期:2014-09-19 11:12:37双鱼座
日期:2014-07-25 10:09:54程序设计版块每日发帖之星
日期:2015-08-24 06:20:00
2 [报告]
发表于 2014-10-18 15:36 |只看该作者
用 file 命令能看文件编码,你看看从mysql倒出来的csv文件到底是什么格式, 如果是gbk,用excel 打开应该能正常显示的,

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
3 [报告]
发表于 2014-10-18 17:29 |只看该作者
类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等软件识别这个文件是否以UTF-8编码。

你的文件可能就是缺这个标记。

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
4 [报告]
发表于 2014-10-18 17:33 |只看该作者
windos假定用户不知道文件编码,所以文件需要自己说明自己。

lunix假定用户总知道文件编码,所以提供工具让用户自己指定编码打开文件。

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
5 [报告]
发表于 2014-10-19 10:04 |只看该作者
那应该怎么办呢?

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
6 [报告]
发表于 2014-10-19 10:55 |只看该作者
本帖最后由 bikkuri 于 2014-10-19 11:27 编辑

谢谢您的指点!
我对比在Windows下用notepad生成的文件和在Linux下用iconv生成的文件,发现前者确实比后者在文件开头多了三个BOM字节(ef bb bf),其他部分都是一样的。
[root@hp8 test]# ls -l *.csv
-rw-r--r-- 1 root root 1172052 Oct 19 01:27 data_in_chinese_utf-8_notepad.csv
-rw-r--r-- 1 root root 1172049 Oct 19 10:41 data_in_chinese_utf-8_iconv.csv
[root@hp8 test]# cat data_in_chinese_utf-8_notepad.csv|hexdump -C|head -n 1
00000000  ef bb bf 22 e6 9d 8e e5  bf 97 e7 a7 80 22 2c 22  |...".........","|
[root@hp8 test]# cat data_in_chinese_utf-8_iconv.csv|hexdump -C|head -n 2
00000000  22 e6 9d 8e e5 bf 97 e7  a7 80 22 2c 22 31 35 32  |".........","152|


爻易 发表于 2014-10-18 17:29
类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等软件识别这个文件是否以UTF-8编码。

你的文件可能就是缺这个标记。

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
7 [报告]
发表于 2014-10-19 11:41 |只看该作者
学生党:飘过~试试python,注意原始编码和目标编码一定要写对了...不然会出问题的

  1. #!/usr/bin/env python
  2. # -*- coding: gbk -*-
  3. """
  4. @author:白头发
  5. @copyright: just for fun!
  6. """
  7. import os
  8. import glob

  9. class FEncoding(object):
  10.     def __init__(self):
  11.         self.extension='.*'
  12.         self.srcsencod=None
  13.         self.dessencod=None
  14.     def setsrcencod(self,srcsencod):
  15.         self.srcsencod=srcsencod
  16.         print self.srcsencod
  17.     def setdesencod(self,dessencod):
  18.         self.dessencod=dessencod
  19.         print self.dessencod
  20.     def setentenson(self,extension):
  21.         if not extension.startswith('.'):
  22.                 self.extension=''.join(['.',extension])
  23.         else:
  24.                 self.extension=extension
  25.     def convertcode(self,content):
  26.         return content.decode(self.srcsencod).encode(self.dessencod)
  27.     def file222file(self,f_name):
  28.         try:
  29.             f_d=open(f_name,'rb')
  30.             f_c=f_d.read()
  31.             f_d.close()
  32.             print f_c
  33.             f2d=open(f_name,'wb')
  34.             f2d.write(self.convertcode(f_c))
  35.             f2d.close()
  36.             print '{}-转码成功'.format(f_name)
  37.         except Exception as e:
  38.             print e
  39.     def processdirs(self,root,dirs,files):
  40.         for x in files:
  41.             if x.endswith(self.extension) or self.extension=='.*':
  42.                 self.file222file(os.path.join(dirs,x))
  43. if __name__=='__main__':
  44.         trans=FEncoding()
  45.         trans.setentenson(raw_input('文件类型:'))
  46.         trans.setsrcencod(raw_input('原始编码:'))
  47.         trans.setdesencod(raw_input('目标编码:'))
  48.         topdr=raw_input('指定目录:')
  49.         os.path.walk(topdr,trans.processdirs,None)
复制代码
测试:
$ ./www.yhsafe.net.py
文件类型:.csv
原始编码:GB2312
GB2312
目标编码:UTF-8
UTF-8
指定目录:./
1,2,3,小满
./data_in_chinese.csv-转码成功
$ file data_in_chinese.csv
data_in_chinese.csv: UTF-8 Unicode text, with no line terminators
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP