注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

FY

Johnson 's Blog

 
 
 

日志

 
 

PERL读取文件(编码shiftjis)登录oracle数据库时,无法读取日语特殊字符解决方法  

2013-06-26 21:18:25|  分类: perl |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在读取日语编码shiftjis的csv文件时,若文件中存在日语特殊字符,如‘①’、‘Ⅱ’。用shiftjis读取该文件后,读到的数据就会被解析成带'\x87'字符串。
程序在运行时会报出警告:
shiftjis "\x87" does not map to Unicode at ***.pl line ***, line *** 
(第一个***是文件名。之后的是行号)
如此会导致把读取到要登入db的数据与文件中的数据不符。

解决方法:用'cp932'的编码方式读取就可解决这个问题。

经调查个人将'cp932'理解为同时包含shiftjis和特殊字符的一种编码方式,同样是shiftjis,但是比shiftjis覆盖面大。
关于两者的区别可以参照:http://charset.uic.jp/compare/cp932/shift_jis/bold/

下面记录perl简单读取shiftjis编码的csv文件
sample:
my $CP932 = 'cp932';
sub load_input_csv {
    eval{
        my (
            $file_full_path,                                          # 路径
            $ref_data                                                 # 存放文件内容的数组指针
            ) = @_;            
        my $file_handle = IO::File->new($file_full_path) or die 'cannot open file';   # 打开文件
        binmode( $file_handle, ":encoding( $CP932 )" );               # 用cp932读取文件
        my $csv = Text::CSV_XS->new({binary => 1});
        my $line_no = 0;                                              # 行号
        
        until ($file_handle->eof) {
            my $columns = $csv->getline($file_handle);                # 获取文件数据
            $line_no = $line_no +1 ; 
            
            my $column_count = scalar(@$columns);                     # 列数取得
            for(my $i = 0;$i < $column_count;$i++){                     
                $ref_data -> [$line_no][$i+1] = ($columns->[$i]);     # 将第一行第一列的数据存入                                                                           二维数组的[1][1]位置,依                                                                           次存放
            }
        }
    };
    if($@){                                                           # 异常处理
        print 'error';
    }
}

my @data = ();                                                        # 数组
&load_input_csv('C:\Test.csv',\@data);                                # 调用读取函数,将结果存入                                                                           数组中

登入oracle(shiftjis格式)中
连接oracle的方法之前有记录,可查阅,连接完,写好sql文,用'cp932'进行编码一下即可登入shiftjis的db中:
my $a = $data[1][1];                                                  第一行第一列的数据是‘①’
my $sql ="insert into Table1(column1) values (\'$a')";                # sql文
$sql = &Encode::encode( "$CP932" , $sql );                            # 编码
之后执行sql文即可插入db。

连接db和insert操作可参照之前“Perl DBI数据库操作”:
  评论这张
 
阅读(221)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018