免费注册 查看新帖 |

Chinaunix

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

中文匹配的问题 [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-09-30 11:36 |只看该作者 |倒序浏览
测试环境:Windows
编辑器:gvim 7.4
我的代码如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Encode qw /encode decode/;

  5. my $contact1 = '330000L1C39403陈喆';
  6. my $contact2 = '330000L1C40201霍继艳';

  7. $contact1 = decode ('gb2312', $contact1);
  8. my @aData = $contact1 =~ m/[a-z0-9]+|[\x{4E00}-\x{9FA5}]+/gi;
  9. print encode ('gb2312', $_), "\n" for @aData;
复制代码
输出结果:
330000L1C39403


我期望的输出结果是输出完整的姓名 陈喆
因为文档中涉及 1W+ 的记录, 文本格式为 gb2312. 请教下大家, 这种情况应该如何处理. 谢谢大家!



求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
2 [报告]
发表于 2016-09-30 11:57 |只看该作者
本帖最后由 104359176 于 2016-09-30 12:11 编辑

如果你的编辑器是 vim, 那么在编辑器中输入的中文,大概就是 utf8 编码的,如果你处理的是外部文件,读入的时候,最好使用对应的文件句柄解码形式, 和输出的文件句柄解码模式匹配。

  1. use strict;
  2. use warnings;
  3. use 5.014;

  4. # ==============脚本功能介绍===================
  5. # 将文件按照两种编码转换成UTF8格式,用眼睛看哪种是正确的编码
  6. # =========================================

  7. use Encode;
  8. use utf8;
  9. my $file = "test.txt";
  10. open(my $fh, '<', $file) or die $!;
  11. while (my $line = <$fh>) {
  12.         chomp $line;
  13.         say "not touch";
  14.         say {$fh} $line;
  15.         my $decode_line = decode('gbk', $line);
  16.         my $encode_line = encode('utf8', $decode_line);
  17.         say "decode->gbk encode->utf8";
  18.         say {$fh} $encode_line;
  19.         $decode_line = decode('utf8', $line);
  20.         $encode_line = encode('utf8', $decode_line);
  21.         say "decode->utf8 encode->utf8";
  22.         say {$fn} $encode_line;
  23. }
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
3 [报告]
发表于 2016-09-30 12:50 |只看该作者
回复 2# 104359176
可能我还是没有体会到大神的意思, 不过我的问题已经得到解决了. 代码如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Encode qw /encode decode/;

  5. my $contact1 = '130203L1C39403陈喆';
  6. my $contact2 = '130203L1C40201霍继艳';

  7. $contact1 = decode ('cp936', $contact1);
  8. my @aData = $contact1 =~ m/[a-z0-9]+|[\x{4E00}-\x{9FA5}]+/gi;
  9. print encode ('cp936', $_), "\n" for @aData;
复制代码
我先把手头的工作弄下, 忙完后一定仔细的拜读大神提供的代码. 非常感谢大神指点!!!



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP