免费注册 查看新帖 |

Chinaunix

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

如何处理excel中的特殊字符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-10 10:11 |只看该作者 |倒序浏览
20可用积分
本帖最后由 dahe_1984 于 2014-03-10 10:14 编辑

比如 α-Sexithiophene,

从excel中读出后在写入,变成了

最佳答案

查看完整内容

回复 1# dahe_1984 分析出来了,α-Sexithiophenea6 c1 2d 53 65 78 69 74 68 69 6f 70 68 65 6e 65从Excel2003表格读取时,变成了 - S e x i t h i o p h e n e编码为:3 b1 0 2d 0 53 0 65 0 78 0 69 0 74 0 68 0 69 0 6f 0 70 0 68 0 65 0 6e 0 65a6 c1 是α的GBK码, 03 b1 是unicode码,其实这里是UTF-16BE所有字符变成了双字节表达形式,说明EXCEL2003对于ASCII范围外地字符是统一保存为 UTF-16BE的代码中的xcode函数只是用 ...

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
2 [报告]
发表于 2014-03-10 10:11 |只看该作者
本帖最后由 523066680 于 2014-03-15 19:48 编辑

回复 1# dahe_1984


分析出来了,
α-Sexithiophene
a6 c1 2d 53 65 78 69 74 68 69 6f 70 68 65 6e 65


从Excel2003表格读取时,变成了
 - S e x i t h i o p h e n e
编码为:
3 b1 0 2d 0 53 0 65 0 78 0 69 0 74 0 68 0 69 0 6f 0 70 0 68 0 65 0 6e 0 65

a6 c1 是α的GBK码, 03 b1 是unicode码,其实这里是UTF-16BE
所有字符变成了双字节表达形式,说明EXCEL2003对于ASCII范围外地字符是统一保存为 UTF-16BE的
  1. use Spreadsheet::Read;
  2. use Spreadsheet::WriteExcel;
  3. use Encode;

  4. # Read
  5. my $book  = ReadData ("a.xls");
  6. my $cell  = $book->[1]{cell}[1][1];
  7. #在win32下的终端输出,先按utf16-LE解码 然后按GBK编码
  8. print encode('gbk',decode('utf16-BE',$cell)),"\nCode: ";
  9. print xcode($cell,'x');

  10. # Write
  11. my $workbook=Spreadsheet::WriteExcel->new('b.xls');
  12. $worksheet = $workbook->add_worksheet();
  13. $worksheet->write(0,0,decode('utf16-BE',$cell));
  14. #这里试了几次,解码后再写入xls,显示就正常了。

  15. sub xcode {
  16.     # xcode("string",'Mode'); Mode = x(hex), b(bin), d(int)
  17.     for my $v ( split(//,$_[0]) ) {
  18.         print sprintf ("%l$_[1] ",ord($v));
  19.     }
  20.     print "\n\n";
  21. }
复制代码
代码中的xcode函数只是用来显示字符串编码。


参考文件.rar (4.43 KB, 下载次数: 8)

论坛徽章:
0
3 [报告]
发表于 2014-03-10 10:39 |只看该作者
最近怎么没人呢?仙子呢

论坛徽章:
0
4 [报告]
发表于 2014-03-10 16:07 |只看该作者
最近这里都没落了,一点人气都没有

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
5 [报告]
发表于 2014-03-10 17:26 |只看该作者
{:2_167:}  貌似仙子最近忙于杀贪官, 所以最近没人呢
{:2_172:}  保持信心: 当诛灭贪官八百万後, 她会回来的

回复 2# dahe_1984


   

论坛徽章:
0
6 [报告]
发表于 2014-03-12 15:25 |只看该作者
怎么没人气了? perl没人搞了?

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
7 [报告]
发表于 2014-03-12 17:32 |只看该作者
本帖最后由 523066680 于 2014-03-12 17:33 编辑

你没有说用的是哪一个模块,EXCEL是2003 还是其他版本
如果在其他帖子发过,那也应该贴个链接。

论坛徽章:
0
8 [报告]
发表于 2014-03-13 01:00 |只看该作者
回复 6# 523066680

什么版本都行。




   

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
9 [报告]
发表于 2014-03-15 17:26 |只看该作者
本帖最后由 523066680 于 2014-03-15 17:27 编辑

Excel 2007 [xlsx]的处理方法
(在xlsx中读取出的是utf-8编码形式)
  1. use Spreadsheet::Read;
  2. use Excel::Writer::XLSX;
  3. use Encode;

  4. # Read
  5. my $book  = ReadData ("a.xlsx");
  6. my $cell  = $book->[1]{cell}[1][1];

  7. # Write
  8. my $workbook = Excel::Writer::XLSX->new('b.xlsx');
  9. my $worksheet = $workbook->add_worksheet();
  10. $worksheet->write('A1', decode('utf-8',$cell));
复制代码

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
10 [报告]
发表于 2014-03-15 23:23 |只看该作者
本帖最后由 523066680 于 2014-03-15 23:24 编辑

发错了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP