代码写得没问题,但是上传上来后就有了问题(比如第35、36行),
具体原因应该是网站的问题,
点击(此处)折叠或打开
- #用perl处理Excel通讯录(从Excel复制到input.txt),最后形成vCard的
- #vcf通讯录不乱码,传到手机QQ上,然后打开就可以导入通讯录联系人
- #2019年5月6日
- ###############################################################
- #input.txt文件格式如下:
- #第一列姓名,第二列工作单位,第三列手机号,中间空格分开
- #或者第一列姓名,第二列手机号,中间空格分开
- ###############################################################
- #比如输入文件内容如下:
- #张三 家里蹲公司 12345678901
- #李四 1234567
- ###############################################################
- #输出内容如下:
- #BEGIN:VCARD
- #VERSION:2.1
- #N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E5=BC=A0=E4=B8=89;;;
- #FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=BC=A0=E4=B8=89
- #TEL;CELL:12345678901
- #ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=AE=B6=E9=87=8C=E8=B9=B2=E5=85=AC=E5=8F=B8
- #END:VCARD
- #BEGIN:VCARD
- #VERSION:2.1
- #N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E6=9D=8E=E5=9B=9B;;;
- #FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E6=9D=8E=E5=9B=9B
- #TEL;CELL:1234567
- #END:VCARD
- ###############################################################
- #检验网站:记得选择utf-8,而不是GB2312
- #web.chacuo.net/charsetquotedprintable
- ###############################################################
- use MIME::QuotedPrint;
- use Encode;
- use strict;use warnings;use diagnostics;
- #先打开读取文件内容,保存到数组里面
- open(FHa,');#读取通讯录
- my @data=<FHa>;
- close(FHa);
- #输出结果
- open(FHb,'>output_address.vcf');#输出通讯录
- foreach my $line (@data)
- {
- chomp($line);
- if($line=~m/^\s*(\S+)\s+(\S+)\s+(\d{7,12})\s*$/)#姓名,工作单位,手机号
- {
- my $name=gbbm($1);#姓名编码
- my $corp=gbbm($2);#工作单位
- print FHb "BEGIN:VCARD\n";
- print FHb "VERSION:2.1\n";
- print FHb "N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;$name;;;\n";
- print FHb "FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$name\n";#姓名
- print FHb "TEL;CELL:$3\n";#手机号
- print FHb "ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$corp\n";#工作单位
- print FHb "END:VCARD\n";
- }elsif($line=~m/^\s*(\S+)\s+(\d{7,12})\s*$/)#姓名,手机号
- {
- my $name=gbbm($1);#姓名编码
- print FHb "BEGIN:VCARD\n";
- print FHb "VERSION:2.1\n";
- print FHb "N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;$name;;;\n";
- print FHb "FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$name\n";#姓名
- print FHb "TEL;CELL:$2\n";#手机号
- print FHb "END:VCARD\n";
- }else
- {
- print FHb "$line error88888888\n";#8个8,输出错误行的内容以及标志,方便搜索删除
- }
- }
- close(FHb);
- #子函数gbbm(改变编码),改变字符串编码,由于Windows上基本都是cp936复制粘贴,
- #所以先把编码从cp936转化成utf-8,然后再转化成QUOTED-PRINTABLE
- sub gbbm{
- my($str)=shift(@_);
- $str=encode("utf8",decode("cp936",$str));#编码转换
- $str=encode_qp($str);#QUOTED-PRINTABLE
- chomp($str);#如果有回车就删除掉
- $str=~s/=$//g;#不知道末尾为什么多一个=号,多了就删除掉
- return $str;
- }
#用perl处理Excel通讯录(从Excel复制到input.txt),最后形成vCard的
#vcf通讯录不乱码,传到手机QQ上,然后打开就可以导入通讯录联系人
#2019年5月6日
###############################################################
#input.txt文件格式如下:
#第一列姓名,第二列工作单位,第三列手机号,中间空格分开
#或者第一列姓名,第二列手机号,中间空格分开
###############################################################
#比如输入文件内容如下:
#张三 家里蹲公司 12345678901
#李四 1234567
###############################################################
#输出内容如下:
#BEGIN:VCARD
#VERSION:2.1
#N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E5=BC=A0=E4=B8=89;;;
#FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=BC=A0=E4=B8=89
#TEL;CELL:12345678901
#ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=AE=B6=E9=87=8C=E8=B9=B2=E5=85=AC=E5=8F=B8
#END:VCARD
#BEGIN:VCARD
#VERSION:2.1
#N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E6=9D=8E=E5=9B=9B;;;
#FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E6=9D=8E=E5=9B=9B
#TEL;CELL:1234567
#END:VCARD
###############################################################
#检验网站:记得选择utf-8,而不是GB2312
#web.chacuo.net/charsetquotedprintable
###############################################################
use MIME::QuotedPrint;
use Encode;
use strict;use warnings;use diagnostics;
#先打开读取文件内容,保存到数组里面
open(FHa,'my @data=;
close(FHa);
#输出结果
open(FHb,'>output_address.vcf');#输出通讯录
foreach my $line (@data)
{
chomp($line);
if($line=~m/^\s*(\S+)\s+(\S+)\s+(\d{7,12})\s*$/)#姓名,工作单位,手机号
{
my $name=gbbm($1);#姓名编码
my $corp=gbbm($2);#工作单位
print FHb "BEGIN:VCARD\n";
print FHb "VERSION:2.1\n";
print FHb "N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;$name;;;\n";
print FHb "FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$name\n";#姓名
print FHb "TEL;CELL:$3\n";#手机号
print FHb "ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$corp\n";#工作单位
print FHb "END:VCARD\n";
}elsif($line=~m/^\s*(\S+)\s+(\d{7,12})\s*$/)#姓名,手机号
{
my $name=gbbm($1);#姓名编码
print FHb "BEGIN:VCARD\n";
print FHb "VERSION:2.1\n";
print FHb "N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;$name;;;\n";
print FHb "FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$name\n";#姓名
print FHb "TEL;CELL:$2\n";#手机号
print FHb "END:VCARD\n";
}else
{
print FHb "$line error88888888\n";#8个8,输出错误行的内容以及标志,方便搜索删除
}
}
close(FHb);
#子函数gbbm(改变编码),改变字符串编码,由于Windows上基本都是cp936复制粘贴,
#所以先把编码从cp936转化成utf-8,然后再转化成QUOTED-PRINTABLE
sub gbbm{
my($str)=shift(@_);
$str=encode("utf8",decode("cp936",$str));#编码转换
$str=encode_qp($str);#QUOTED-PRINTABLE
chomp($str);#如果有回车就删除掉
$str=~s/=$//g;#不知道末尾为什么多一个=号,多了就删除掉
return $str;
}