从网上搜索到的资料说,默认微软 wma 格式音频文件的 tag 是用 utf-16le 编码的。
我用 Audio::WMA 取得 tag 信息,用 utf-16le decode后,汉字解码正常,凡是遇到夹杂在中文字串中的英文字母或者短横
之类的符号就乱码(显示成不正确的汉字或奇怪的符号)。如果用 latin1 或 gbk 来 decode,则所有汉字显示乱码,而夹杂在汉字里面的
英文字母和符号显示正常。
怀疑这些字符串是混合编码的,汉字使用 utf-16le 编码,而英文字母和符号使用 latin1 编码,然后凑成一个完整的字符串。究竟是不是这
样呢?还是 perl 对 utf-16le 解码本身有 bug?
这样的字符串怎样才能正确解码呢?
如果是混合编码的话,作为模拟,一下脚本是一个实验:
#!/usr/bin/perl
use Encode;
$s1="出征进行曲";
$s1=decode_utf8($s1);
$s1=encode('utf-16le',$s1); #直接这样编码成 utf-16le是完全没问题的
$s2="-AFtest-第4曲";
$s2=decode_utf8($s2);
$s2=encode('gbk',$s2); #直接这样编码成 gbk 也是完全没问题的
$string=$s1.$s2; #这里,为了模拟,制作了一个混合编码字串
$aa=decode('utf-16le',$string); # 这里,用 utf-16le 解码
$aa=encode('utf8', $aa); #这里,让 perl 去掉标签,不会打印Wide character的警告
print "$aa\n"; #这里,原 $s1 部分解码正常,原 $s2 部分乱码
$aa=decode('gbk',$string); # 这里,用 gbk 解码
$aa=encode('utf8', $aa); #这里,让 perl 去掉标签,不会打印Wide character的警告
print "$aa\n"; #这里,原 $s1 部分乱码,原 $s2 部分显示正常
如何让整个 $string 都正确解码呢?
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---
没有评论:
发表评论