Drifter
发表于 2006-11-26 05:00
这是一个在普通手机(SE)上输入的联系人传到电脑上的vCard文件. 它传到另一个手机上(NEC)上后完全正常, 全部字段包括NOTE字段都很正常. 这个可以看成是我们的目标文件格式. 它已经包括了最常用到中文的几个字段.
注意那些quoted-printable在换行的时候多了一个"=", 不知道为什么. 原文件也附在下面.
BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;Test=E4=B8=AD=E6=96=87=E5=90=8D==
E5=AD=97
TITLE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E7=BB=8F=E7=90=86
ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=85=AC=E5=8F=B8=E5=90=8D=E5==
AD=97
TEL;WORK:075512345678
TEL;CELL:13902945678
EMAIL;INTERNET;PREF:test@mail.com
EMAIL;INTERNET:
EMAIL;INTERNET:
URL:www.web.com
ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=E5=9C=B0=E5=9D=802;;;;
ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=E5=9C=B0=E5=9D=801;;;;
NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=85=B6=E5=AE=83=E8=AF=B4=E6=
=98=8E=E6=96=87=E5=AD=97
X-IRMC-LUID:000200000215
END:VCARD
Drifter
发表于 2006-11-26 05:00
原帖由 huanggx 于 2006-11-26 04:51 发表
Drifter兄, 你究竟是要转码的结果还是要转码的解决方案?
我想把650上的电话本转到我的NEC手机上去...
huanggx
发表于 2006-11-26 05:13
被quoted-printable编码的是utf-8。这个用脚本不好转换了。java可以胜任。
至于行尾那个多出来的=,可能是规范吧。但上面你贴出来的ADDR字段,怎么会有=801,=802?
三位数是什么?
要完全正确地转码,需要研究vcard规范。如果只是为了转换几个vcard,那就具体问题具体分析,简单地代码处理。
要规范解决,要花费很大精力和时间。所以我才问你究竟是要结果还是要解决方案
huanggx
发表于 2006-11-26 05:17
我去睡觉了, 晚安
Drifter
发表于 2006-11-26 05:19
BEGIN:VCARD
VERSION:2.1
X-PALM:4.0
N;CHARSET=windows-1252:Test;测试用户
CHARSET=windows-1252
公司名字也很容易出问题
ADR;WORK;CHARSET=windows-1252:;;工作地址;;;;
ORG;CHARSET=windows-1252;ENCODING=QUOTED-PRINTABLE:=
=B9=AB=CB=BE=C3=FB=D7=D6=D2=B2=BA=DC=C8=DD=D2=D7=B3=F6=CE=CA=CC=E2
NOTE;CHARSET=windows-1252;ENCODING=QUOTED-PRINTABLE:=
=D2=BB=D0=A9=CB=B5=C3=F7. =BA=DC=B3=A4=BA=DC=B6=E0=B5=C4=CB=B5=C3=F7=2C =
=B6=E0=B5=BD=C8=ED=BC=FE=B4=A6=C0=ED=B2=BB=C1=CB=CE=AA=D6=B9.
TEL;PREF;WORK;VOICE:075587654321
TEL;CELL:13912345678
UID:13264502
END:VCARD
这个是650产生的vCard, 这次终于看清楚了. 虽然都是qoted-printable, 但它们的真实编码, 却是按照它前面所说的那个编码来做的. 虽然都加了一堆"="号, 但其实是不一样的, 所以不能直接改一下编码的名字. 电话不认的. 大概它不符合某种校验.
现在比较清楚了, 我所需要做的如下:
对于非NOTE字段, 找到windows-1252, (有这个表示后面跟的是非英文的内容, 在我们这里就是中文的内容了).把里面的中文字从GB码转成utf-8, 并且用quoted-printable表示. 然后把前面的编码名字相应地变成utf-8.
对于NOTE字段, 找到windows-1252, 接着把后面的quoted-printable表示的中文转成gb码, 然后转成utf-8, 然后再用quoted-printable表示. 最后把编码的名字改成utf-8.
因为是对一个大文件进行转换, 一直扫到eof为止. 这样就不需要分割原来的文件了.
PS, NOTE字段特殊, 是因为在650上, 它不在标准的联系人里面, 而是用一种附加的方式跟着联系人, 所以它已经被编码了.
Drifter
发表于 2006-11-26 05:21
原帖由 huanggx 于 2006-11-26 05:13 发表
被quoted-printable编码的是utf-8。这个用脚本不好转换了。java可以胜任。
至于行尾那个多出来的=,可能是规范吧。但上面你贴出来的ADDR字段,怎么会有=801,=802?
三位数是什么?
要完全正确地转码,需要 ...
上面的这个是"目标"格式, 也就是说, 先把gb转成utf-8, 然后以quoted-printable表示.
那个801, 是数字1, 802, 是数字2 . 整个的内容分别是"地址1"和"地址2".
希望明天有时间再来看看. 我上面已经把整个过程都分析清楚了.
Drifter
发表于 2006-11-26 05:30
原帖由 yiylu 于 2006-11-26 03:51 发表
我的也来了!^,^
用法:待处理文件改名为 start.vcf
处理好生成: ready.vcf
如需继续下一个,请移走 ready.vcf 再进行。
下载:http://www.luzhinan.com/vcard.rar
这个程序的框架已经够了, 下面是正确的处理过程:
=============================
对于非NOTE字段, 找到windows-1252, (有这个表示后面跟的是非英文的内容, 在我们这里就是中文的内容了).把里面的中文字从GB码转成utf-8, 并且用quoted-printable表示. 然后把前面的编码名字相应地变成utf-8.
对于NOTE字段, 找到windows-1252, 接着把后面的quoted-printable表示的中文字还原成gb码, 然后转成utf-8, 然后再用quoted-printable表示. 最后把编码的名字改成utf-8.
因为是对一个大文件进行转换, 一直扫到eof为止. 这样就不需要分割原来的文件了.
=================================================
PS, NOTE字段特殊, 是因为在650上, 它不在标准的联系人里面, 而是用一种附加的方式跟着联系人, 所以它已经被编码了.
chippendale
发表于 2006-11-26 09:17
原帖由 Drifter 于 2006-11-25 21:43 发表
哦, 对了. 它自己带的桌面同步软件. 不用这个行不行? 因为根本没有装它.
装一下就可以了,何必这么麻烦。。。
Drifter
发表于 2006-11-26 13:03
原帖由 chippendale 于 2006-11-26 09:17 发表
装一下就可以了,何必这么麻烦。。。
也许吧. 虽然装了会有其它的一些问题. 没办法了这个也算是一个办法.
yiylu
发表于 2006-11-26 17:30
quoted printable 的编码/解码 现已不成问题。
现在的关键是描出 650 生成的 vcard 的格式规律,这个清晰了问题就解决了。
Drifter 你给出 650 vcard 的标准格式,要有代表性的。因为我目前对650的格式尚存疑问,
95楼的例子很好,你就用这个sample,但“公司名字也很容易出问题”我就不明了,他属于那部分的信息。同时,你再放上各项的信息的具体内容,我才能弄清分界点。
还有650的vcard导入其他手机后,哪些能显示,哪些不行,你还没说清楚。
这么一来所有就近乎解决了!
[ 本帖最后由 yiylu 于 2006-11-26 17:37 编辑 ]
Drifter
发表于 2006-11-26 18:04
原帖由 yiylu 于 2006-11-26 17:30 发表
quoted printable 的编码/解码 现已不成问题。
现在的关键是描出 650 生成的 vcard 的格式规律,这个清晰了问题就解决了。
Drifter 你给出 650 vcard 的标准格式,要有代表性的。因为我目前对650的格式尚存 ...
"公司名字..."那个字段是ORG, 也就是联系人里面的"公司"一项.
我上面给出的例子及说明, 已经是很典型的了. 就照着这个来做应该就可以了.
我认为650的格式我已经描述得很清楚了. 还有哪里不明确?
Drifter
发表于 2006-11-26 18:05
91楼的内容, 导入任何手机都可以完整正确地显示的.
Drifter
发表于 2006-11-26 18:08
650生成的文件, 换行比较奇怪. 就比如"公司名字..."那一行, 我觉得是前面的"windows-1252"后面少了一个":"或";", 所以不对. 但这些内容我没有改过的.
看起来, NOTE部分要单独处理.
除了NOTE以外的部分, 应该在"windows-1252"后面都有一个分隔符.
yiylu
发表于 2006-11-26 21:26
All Done! 顺利转换成 UTF-8 编码的 quoted_printable 数据。
因为我这outlook会乱码,所以测试也许不充分。你试试~
[ 本帖最后由 yiylu 于 2006-11-26 21:38 编辑 ]
Drifter
发表于 2006-11-26 21:57
这几天专门网, 慢死人了.
yiylu
发表于 2006-11-26 22:02
来个镜像:
http://www.luzhinan.com/vcard-rev1.rar
Drifter
发表于 2006-11-26 22:07
一国二网又出问题了. 二个小文件居然下不下来...气死人.
Drifter
发表于 2006-11-26 22:10
原帖由 yiylu 于 2006-11-26 22:02 发表
来个镜像:
http://www.luzhinan.com/vcard-rev1.rar
3秒钟就搞下来了...吼吼
yiylu
发表于 2006-11-26 22:19
原帖由 Drifter 于 2006-11-26 18:08 发表
650生成的文件, 换行比较奇怪. 就比如"公司名字..."那一行, 我觉得是前面的"windows-1252"后面少了一个":"或";", 所以不对. 但这些内容我没有改过的.
看起来, NOTE部 ...
我也觉得这个有问题,单独这么一行,上下无关联的,所以我首先就把它去掉。
vcard 行末尾的“=”是连接符,“:”后面的是字段的值。
有问题提出来,我继续《迈阿密风云》了:D
Drifter
发表于 2006-11-26 22:35
Note部分还是不理想. 先是转换到某个地方直接停下来了. 我把那个有问题的Note拿掉, 可以继续了. 但产生的文件在NEC手机里面显示到某个名字就不显示了. (应该是某种校验不对).
我干脆把源文件中所有的NOTE全部拿到, 一切就都正常了.
据我观察, 在Note中有=0D=0A的地方就很有可能出问题. (原来的NOTE中回车/换行).
联系到quoted-printable本身对换行处理的问题. 可以理解.
我没有仔细去对一下, 是不是一行NOTE就没有问题, 多行就有问题. 基本上NOTE部分不是最重要的. 所以我的目的可以说90%已经达到了. 谢谢.
想不想再搞清楚? 想玩的话我们可以再研究下.
我觉得, 加个界面, 你可以把这个东西做成一个for 650的shareware了:)
原帖由 yiylu 于 2006-11-26 22:19 发表
我也觉得这个有问题,单独这么一行,上下无关联的,所以我首先就把它去掉。
vcard 行末尾的“=”是连接符,“:”后面的是字段的值。
有问题提出来,我继续《迈阿密风云》了:D
yiylu
发表于 2006-11-27 01:30
有空我再改进一下算法,转换完美是最基本的。用#95的例子转换好能完全读取吗?你是说转换后=0D=0A夹杂在里面,那样肯定会有问题。
Drifter
发表于 2006-11-27 01:39
原帖由 yiylu 于 2006-11-27 01:30 发表
有空我再改进一下算法,转换完美是最基本的。用#95的例子转换好能完全读取吗?你是说转换后=0D=0A夹杂在里面,那样肯定会有问题。
用#95的例子转换的结果是有问题的.
结果是这样的:
BEGIN:VCARD
VERSION:2.1
X-PALM:4.0
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:Test;=e6=b5=8b=e8=af=95=e7=94=a8=e6=88=b7
=e5=85=ac=e5=8f=b8=e5=90=8d=e5=ad=97=e4=b9=9f=e5=be=88=e5=ae=b9=e6=98=93=e5=87=ba=e9=97=ae=e9=a2=98
ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=e5=b7=a5=e4=bd=9c=e5=9c=b0=e5=9d=80;;;;
ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=e5=85=ac=e5=8f=b8=e5=90=8d=e5=ad=97=e4=b9=9f=e5=be=88=e5=ae=b9=e6=98=93=e5=87=ba=e9=97=ae=e9=a2=98
NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=e4=b8=80=e4=ba=9b=e8=af=b4=e6=98=8e. =e5=be=88=e9=95=bf=e5=be=88=e5=a4=9a=e7=9a=84=e8=af=b4=e6=98=8e,
=e5=a4=9a=e5=88=b0=e8=bd=af=e4=bb=b6=e5=a4=84=e7=90=86=e4=b8=8d=e4=ba=86=e4=b8=ba=e6=ad=a2.
TEL;PREF;WORK;VOICE:075587654321
TEL;CELL:13912345678
UID:13264502
END:VCARD
在电话上的效果是, 只有名字显示出来了, 后面的东西不见了. 也就是说, 名字那部分的quoted-printable是有问题的. 导致后面的不被识别了.
Drifter
发表于 2006-11-27 01:53
原帖由 Drifter 于 2006-11-27 01:39 发表
用#95的例子转换的结果是有问题的.
结果是这样的:
BEGIN:VCARD
VERSION:2.1
X-PALM:4.0
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:Test;=e6=b5=8b=e8=af=95=e7=94=a8=e6=88=b7
=e5=85=ac=e5=8f ...
看了一下, 这个不是你的转换软件的问题.
首先, 那个"公司名字也很容易出问题"本身有问题. 第二, 后面的NOTE部分似乎太长了. 电话本身是可以支持很长的说明, 但可能传的过程有限制, 太长以后, 后面的东西全部不认了.
我把输入的文件作了一些调整如下. 主要是把"公司名字..."那部分放入ORG字段, 并且在1252后面加了一个":". 还有, 把电话号码放在NOTE前面了.
BEGIN:VCARD
VERSION:2.1
X-PALM:4.0
N;CHARSET=windows-1252:Test;测试用户
ADR;WORK;CHARSET=windows-1252:;;工作地址;;;;
ORG;CHARSET=windows-1252:公司名字也容易出问题
TEL;PREF;WORK;VOICE:075587654321
TEL;CELL:13912345678
NOTE;CHARSET=windows-1252;ENCODING=QUOTED-PRINTABLE:=
=D2=BB=D0=A9=CB=B5=C3=F7. =BA=DC=B3=A4=BA=DC=B6=E0=B5=C4=CB=B5=C3=F7=2C =
=B6=E0=B5=BD=C8=ED=BC=FE=B4=A6=C0=ED=B2=BB=C1=CB=CE=AA=D6=B9.
UID:13264502
END:VCARD
这样, 转换的结果基本对头, 如下:
BEGIN:VCARD
VERSION:2.1
X-PALM:4.0
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:Test;=e6=b5=8b=e8=af=95=e7=94=a8=e6=88=b7
ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=e5=b7=a5=e4=bd=9c=e5=9c=b0=e5=9d=80;;;;
ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=e5=85=ac=e5=8f=b8=e5=90=8d=e5=ad=97=e4=b9=9f=e5=ae=b9=e6=98=93=e5=87=ba=e9=97=ae=e9=a2=98
TEL;PREF;WORK;VOICE:075587654321
TEL;CELL:13912345678
NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=e4=b8=80=e4=ba=9b=e8=af=b4=e6=98=8e. =e5=be=88=e9=95=bf=e5=be=88=e5=a4=9a=e7=9a=84=e8=af=b4=e6=98=8e,
=e5=a4=9a=e5=88=b0=e8=bd=af=e4=bb=b6=e5=a4=84=e7=90=86=e4=b8=8d=e4=ba=86=e4=b8=ba=e6=ad=a2.
UID:13264502
END:VCARD
把这个结果放进电话, 一切都正常了, 除了后面的NOTE部分在电话上只显示到那个","为止. 后面的没有了. 但是, 可以在电话上继续增加, 也就是电话本身是可以支持更长的说明部分的文字的.
应该说转换软件已经没有太大的问题了. 但源文件的NOTE部分似乎不太容易把握.
Drifter
发表于 2006-11-27 01:54
上面说的ODOA, 是在转换前的源文件存在. 如果源文件中有这个0D0A, 转换似乎就会不正常.
yiylu
发表于 2006-11-27 02:53
严重怀疑是不同平台之间的兼容问题,改成这个试试(去掉 X-PALM 部分,改了 UID):
BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:Test;=e6=b5=8b=e8=af=95=e7=94=a8=e6=88=b7
ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=e5=b7=a5=e4=bd=9c=e5=9c=b0=e5=9d=80;;;;
ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=e5=85=ac=e5=8f=b8=e5=90=8d=e5=ad=97=e4=b9=9f=e5=be=88=e5=ae=b9=e6=98=93=e5=87=ba=e9=97=ae=e9=a2=98
NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=e4=b8=80=e4=ba=9b=e8=af=b4=e6=98=8e. =e5=be=88=e9=95=bf=e5=be=88=e5=a4=9a=e7=9a=84=e8=af=b4=e6=98=8e,
=e5=a4=9a=e5=88=b0=e8=bd=af=e4=bb=b6=e5=a4=84=e7=90=86=e4=b8=8d=e4=ba=86=e4=b8=ba=e6=ad=a2.
TEL;PREF;WORK;VOICE:075587654321
TEL;CELL:13912345678
X-IRMC-LUID:000013264502
END:VCARD
Drifter
发表于 2006-11-27 03:03
原帖由 yiylu 于 2006-11-27 02:53 发表
严重怀疑是不同平台之间的兼容问题,改成这个试试(去掉 X-PALM 部分,改了 UID):
BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:Test;=e6=b5=8b=e8=af=95=e7=94=a8=e6=88=b7
ADR;WO ...
这个文件, 放在NEC上就会出现后面的号码部分出不来的现象. 放在SE(索爱)上, 就一切正常. 当然, 说明部分还是被截断了, 截断的长度与在NEC上一样.
可见你的推断是正确的. 确实是兼容性的问题. 因为我给你的格式是从SE上导出的. 所以, 同样的格式在SE上正常. 但NEC不支持从手机导出vCard文件, 所以无法得知.
至此, 基本的都完成了吧? 兼容性的东西, 就没有办法去搞了.
Drifter
发表于 2006-11-27 03:06
原帖由 Drifter 于 2006-11-27 03:03 发表
这个文件, 放在NEC上就会出现后面的号码部分出不来的现象. 放在SE(索爱)上, 就一切正常. 当然, 说明部分还是被截断了, 截断的长度与在NEC上一样.
可见你的推断是正确的. 确实是兼容性的问题. 因为我给你 ...
又做了一个试验, 把上面的文件里, NOTE后面长出来的那部分删除, 再传给NEC, 前面的号码显示正常啦.
可见NEC手机的软件做得烂而已. SE就好得多了.
yiylu
发表于 2006-11-27 03:08
唉,好好的vcard统一标准给厂商弄成这样,实在没意思。呵呵,可以划个句号了。
Drifter
发表于 2006-11-27 03:10
原帖由 yiylu 于 2006-11-27 03:08 发表
唉,好好的vcard统一标准给厂商弄成这样,实在没意思。呵呵,可以划个句号了。
在SE上给说明部分加了点内容, 再弄回到电脑上, 是这样子:
BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:Test;=E6=B5=8B=E8=AF=95=E7=94=A8==
E6=88=B7
ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=85=AC=E5=8F=B8=E5=90=8D=E5==
AD=97=E4=B9=9F=E5=BE=88=E5=AE=B9=E6=98=93=E5=87=BA=E9=97=AE=E9=A2=98
TEL;CELL:13912345678
TEL:075587654321
EMAIL;INTERNET;PREF:
EMAIL;INTERNET:
EMAIL;INTERNET:
ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=E5=B7=A5=E4=BD=9C=E5=9C=
=B0=E5=9D=80;;;;
NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E4=B8=80=E4=BA=9B=E8=AF=B4=E6=
=98=8E. =E5=BE=88=E9=95=BF=E5=BE=88=E5=A4=9A=E7=9A=84=E8=AF=B4=E6=98=8E,=E5=
=A4=9A=E5=88=B0=E6=89=8B=E6=9C=BA=E4=B8=8D=E8=AE=A4=E8=AF=86.
X-IRMC-LUID:0002000006DA
END:VCARD
可见你的转换是没有问题的. 这个长度的限制, 不知道是哪里来的.
谢谢啦, 解决了我一个很实际的问题.
yiylu
发表于 2006-11-27 03:11
原帖由 Drifter 于 2006-11-27 03:06 发表
又做了一个试验, 把上面的文件里, NOTE后面长出来的那部分删除, 再传给NEC, 前面的号码显示正常啦.
可见NEC手机的软件做得烂而已. SE就好得多了.
字符截取我还可以实现,告诉我最大允许多少字,程序先做截取再编码转换。