免费注册 查看新帖 |

Chinaunix

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

perl 中文乱码的问题 [复制链接]

论坛徽章:
2
亥猪
日期:2013-12-24 16:24:04狮子座
日期:2014-01-03 14:56:30
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-24 14:53 |只看该作者 |倒序浏览
请教各位大神,如下代码读取excel的时候中文是乱码,该如何解决,请赐教,谢谢。

#!/usr/bin/perl

use Spreadsheet::Read;
use Spreadsheet::Xlsx;


my $fh = shift;

my $book = ReadData( $fh ) or die "Cannot read file";

my $sheet = $book->[1];

my $count = $sheet->{maxrow};

print ("The count is: $count\n");

foreach $line ( 1..$sheet->{maxrow} ) {

        my $cellE5  = $sheet->{"E$line"};

        my $cellF6  = $sheet->{"F$line"};

        print ("The result is: $cellE5   $cellF6 \n");

}

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
2 [报告]
发表于 2014-06-24 16:52 |只看该作者
use Encode(qw(decode));

论坛徽章:
2
亥猪
日期:2013-12-24 16:24:04狮子座
日期:2014-01-03 14:56:30
3 [报告]
发表于 2014-06-24 17:13 |只看该作者
huang6894 发表于 2014-06-24 16:52
use Encode(qw(decode));


不管用,谢谢。还有其他办法吗?

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
4 [报告]
发表于 2014-06-24 17:28 |只看该作者
回复 3# bblxl2012


    你怎么用的?

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
5 [报告]
发表于 2014-06-24 17:37 |只看该作者
本帖最后由 huang6894 于 2014-06-24 17:38 编辑
  1. use Encode;
  2. our $local_enc = 'cp936';
  3. sub decode_cell($){
  4.   my $cell = shift;
  5.         if (!$cell){
  6.                 return '';
  7.         }
  8.                 if ($cell->{Type} eq 'Text' && defined($cell->{Code})) {
  9.                         if ($cell->{Code} eq 'ucs2') {
  10.                                 $cell->{Val} = decode('UTF16-BE', $cell->{Val});
  11.                         }elsif ($cell->{Code} eq '_native_') {
  12.                                 $cell->{Val} = decode($local_enc, $cell->{Val});
  13.                         }
  14.                 }
  15.                 elsif ($cell->{Type} eq 'Date') {
  16.                 }
  17.                 elsif ($cell->{Type} eq 'Number') {
  18.                 }
  19.                 return $cell->{Val};
  20. }
  21. foreach $i ($sheet->{MinRow}..$sheet->{MaxRow}) {
  22.                 $sheet->{MaxCol} ||= $sheet->{MinCol};
  23.                 $line = join("\t", map {encode('utf8', decode_cell($sheet->{Cells}[$i][$_]))} ($sheet->{MinCol}..$sheet->{MaxCol}));
  24.                 if ($line =~ m/^\t*$/) {
  25.                         $line = '';
  26.                                 }
  27.                 print $line."\n";
  28.                         }
  29.         }
  30. }
复制代码
一个参考

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
6 [报告]
发表于 2014-06-24 20:54 |只看该作者
看过这篇文章没有{:3_193:}
  1. http://bbs.chinaunix.net/thread-1857627-1-1.html
复制代码

论坛徽章:
2
亥猪
日期:2013-12-24 16:24:04狮子座
日期:2014-01-03 14:56:30
7 [报告]
发表于 2014-06-25 12:12 |只看该作者
stanley_tam 发表于 2014-06-24 20:54
看过这篇文章没有


非常感谢,解决了。
加了如下3行即可。

use utf8;
use open ':encoding(gbk)', ':std';
use open ':encoding(utf';

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
8 [报告]
发表于 2014-06-25 13:42 |只看该作者

论坛徽章:
0
9 [报告]
发表于 2014-06-25 14:56 |只看该作者
把pl用记事本另存为,可以选择编码类型,选择ANSI试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP