Rhythmbox乱码的解决的方法
近期尝试 Listen 和 Banshee 才发现,Rhythmbox 上出现的
mp3乱码问题依然,并且更加严重,想要彻底弄清和解决必须搞清两点,第一, mp3 标签类型和编码,第二,各种播放器对
mp3标签读取情况,相信它们应该都有相关的开发文档来说明,但我还是用了一个最笨的方法,就是一个一个的測试来得出结论,真理不是来自于实践吗?
1、了解 mp3 标签类型和使用的编码
首先说 mp3 标签类型和编码,大家应该知道眼下主要存在这几种标准,ID3v1, ID3v2 2.3, ID3v2
2.4,APEv2,ID3v1 仅仅支持 ISO-8859-1 编码 (编码集參考),严格的说它是不支持中文的
(并不代表它不能储存中文信息,眼下中文mp3 的 ID3v1 标签都使用这个字段来储存 GBK/GB18030 编码的中文信息),而第二版
(ID3v2) 支持的格式添加了utf-16,直到 2.4 版才開始支持 uft-8,但 ID3v2 标准没有统一标签内容的编码,比如 2.4
版的 ID3v2 你能够使用ISO-8859-1 编码,也能够使用 utf-16/uft-8 这样的 Unicode
编码格式。做得最好的是APEv2,它不但有非常好的扩展性,并且还把编码格式统一为 utf-8,这样一来仅仅要支持 APEv2 读取的播放器播放带有
APEv2 标签的mp3 就不会存在乱码问题。
2、了解各种播放器对 mp3 标签读取情况
接下来研究的就是各种播放器对这几种标准的标签支持程度,測试的播放器有:gnome 自带的 Rhythmbox 0.10.0,Listen
0.5, Banshee 0.12.1+dfsg-3, Quod Libet 0.24, Exaile! 0.2.8, GMPC0.13.0,
Audacious 1.2.2。
測试的方法非常easy,用一个 mp3 文件,分别写入不同类型的标签 (排列组合下来共 20 多种),在 ID3v1 和 ID3v22.3/2.4
中分别使用不同的编码写入中文信息 (如 GBK编码),然后用这些播放器去读取,得到其结果。从这次的測试结果来看,Rhythmbox 对各种
mp3 的标签支持最好,这主要归功于它支持APEv2 标签的读取。而 Banshee 和剩下的播放器全然一样,都不支持 APEv2
的读取,这个就能非常好的解释为什么一些 mp3 在Rhythmbox 上正常,在其它播放器上就会乱码。原因是如今非常多 mp3
为了兼容,都同一时候使用了 ID3v1 和 APEv2标签,Rhythmbox 读取 ID3v1 一样会乱码,但它优先读取了 APEv2 标签,而
Banshee 这些播放器不支持 APEv2就仅仅能读取 ID3v1,当然会乱码了。
他们的共同特点就是,所依赖的 libid3tag 库全然依照 ID3 标准来读取标签内容。无论使用何种标准的标签,仅仅要是读取以Unicode
编码的中文内容,肯定没有问题,遇到 GBK/GB18030 编码的中文内容时,还是把它当成 ISO-8859-1编码来读取,不乱才怪。
ps: Vista 上的 WMP 不支持 ID3v2 2.4 和
APEv2标签的读取,但它非常聪明不能读取就用文件名称取代,千千静听支持全系列标签的读取,但不支持以 ID3v2 2.4
标准的写入,不知道即将公布的5.0 有变化没有。foobar2000 v0.9.4.3 支持全系列标签的读取,默认使用 ID3v2 2.4 (
utf-8 )写入,不愧被誉为经典。
3、解决的方法
既然明确了乱码的原因,就得找解决的方法,一种办法就像
Win上的播放器一样,能够依据本地的编码方式来解码,或使用一些其它转码机制,要不还能够选择优先读取顺序。以上測试的播放器中除了
Audacious外其它都不支自己定义编码读取功能。另外一个解决的方法就是把 mp3 标签转换为 Unicode编码,这样的方式既简单又支持标准,推荐大家使用。假设像 Banshee 一样支持显示文件路径也能够解决乱码问题,但这不是根本之道。
眼下发现有 2 个工具能够把标签转换为 Unicode 编码,并且都支持批量转换。
1) 一个是周枫用 java 编写的 ID3iconv 0.2.1,最后更新时间为 2004/2/20。
用法:
java -jar ~/id3iconv-0.2.1.jar -e gbk *.mp3
假设想转换当前文件夹下的全部 mp3 (包含子文件夹):
find . -iname "*.mp3" -execdir java -jar ~/id3iconv-0.2.1.jar -e gbk {} /;
* 注意以上 ~/id3iconv-0.2.1.jar 位置依据自己情况而定
* 相信如今大陆绝大多数能找到的 mp3 标签都是以 GBK/GB18030 编码,使用 -e gbk 来处理就够了,当然你也能够使用 -e gb18030 来处理。
* -e gbk 參数是代表把 GBK 编码的标签转换为 Unicode 编码,本身是 Unicode 编码的就不转换。假设须要转换其它编码的文件能够自行改动,如改为 Big5。
* 经測试,转换后为 2.3 版的 ID3v2,编码格式为 uft-16
2) 另外一个是用 Python 写的 “Mutagen”,眼下最新版本号 1.11,Ubuntu 7.04 源里也带有 1.10 版本号的 Mutagen,能够用这个命令来安装:
sudo apt-get install python-mutagen
ps:安装 Quod Libet 和 Listen 都必须这个
用法:
mid3iconv -e gbk *.mp3
假设想转换当前文件夹下的全部 mp3 (包含子文件夹):
find . -iname "*.mp3" -execdir mid3iconv -e gbk {} /;
* 相信如今大陆绝大多数能找到的 mp3 标签都是以 GBK/GB18030 编码,使用 -e gbk 来处理就够了,当然你也能够使用 -e gb18030 来处理。
* -e gbk 參数是代表把 GBK 编码的标签转换为 Unicode 编码,本身是 Unicode 编码的就不转换。假设须要转换其它编码的文件能够自行改动,如改为 Big5。
* 经測试,转换后为 2.4 版的 ID3v2,编码格式为 uft-16
* 只是它会同一时候用 Unicode 编码填满 D3v1, ID3v2, APEv2 标签,可是 ID3v1 又不支持中文的Unicode 编码,所以转换后的 ID3v1 标签全是问号。所以最好加上 –remove-v1 參数,转换后删除 ID3v1 标签。
mid3iconv -e gbk --remove-v1 *.mp
Rhythmbox乱码的解决的方法的更多相关文章
- resin后台输出中文乱码的解决的方法!
近期从tomcat移植到resin,发现这东西不错啊! 仅仅是后台输出时有时候中文会乱码. 如今找到resin后台输出中文乱码的解决的方法: 编辑conf/resin.con文件: <!--ja ...
- ubuntu14.04中 gedit 凝视能显示中文,而source insight中显示为乱码的解决的方法
1.乱码显示情况: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcjc3NjgzOTYy/font/5a6L5L2T/fontsize/400/fill/ ...
- html里显示中文乱码的解决的方法
在HTML开头统一规范下编码格式: <meta http-equiv="Content-Type" content="text/html; charset=utf- ...
- Rhythmbox中文乱码解决的方法
转自:http://hi.baidu.com/morgensonne/item/3470aef58747abde6325d2d9 今天在网络上找到了一个比較好的解决Rhythmbox中文乱码的问题的方 ...
- linux下打开txt显示乱码的解决方法
Linux打开txt文件乱码的解决方法 Linux显示在Windows编辑过的中文就会显示乱码是由于两个操作系统使用的编码不同所致.Linux下使用的编码是utf8,而Windows使用的是gb1 ...
- Asp.net导出Excel乱码的解决方法
通过跟踪Asp.net服务器代码,没有乱码,然而导出Excel到浏览器后,打开时出现乱码. 解决方法是添加编码格式的前缀字节码:Response.BinaryWrite(System.Text.Enc ...
- Mysql命令行中文乱码的解决方法
环境:Windows 8 64位,Mysql 5.0.96 for Win64 (x86) 数据库本身安装时默认已经是使用utf8编码的了,但在命令行中执行查询时,查询到的中文依然乱码,解决方法如下 ...
- ECSHOP编辑器Fckeditor上传图片中文名称乱码的解决方法
ECSHOP编辑器Fckeditor上传图片中文名称乱码的解决方法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2015-02-11 中文名乱码是因为:FCKed ...
- 用c#读取文件内容中文是乱码的解决方法:
用c#读取文件内容中文是乱码的解决方法: //方法1: StreamReader din = new StreamReader(@"C:\1.txt", System.Text.E ...
随机推荐
- bat处理文件
bat处理文件 作用:可以一次性执行多个命令的文件. 为什么要学bat处理文件? 快速运行一个软件一般都会把软件打包一个jar包,但是jar双击可以运行仅对图形化界面的软件起作用,对于控制台的程序是不 ...
- Sybase自增字段跳号的解决方法
Sybase自增字段跳号原因及影响: 在Sybase数据库中如果数据库在开启的情况下,因为非正常的原因(死机.断电)而导致数据库服务进程强制结束. 那么自动增长的字段将会产生跳号的情况,再往数据表里面 ...
- oracle 双机热备,oracle dataguard 和oracle rac的区别和联系(转)
Data Guard 是Oracle的远程复制技术,它有物理和逻辑之分,但是总的来说,它需要在异地有一套独立的系统,这是两套硬件配置可以不同的系统,但是这两套系统的软件结构保持一致,包括软件的版本,目 ...
- Stm32高级定时器(四)
Stm32高级定时器(四) 1 编码器接口模式 1.1 编码器原理 什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向.根 ...
- ORacle 复制表
create table r_register_company as select companyid,companyname,from grdata.r_register_company inser ...
- listener笔记
listener 分四步: 在被观察者类中创建 onXXListener Interface,包含一个方法:xxxListener(object o),参数根据需要观察者需要设定. public in ...
- (原)10-folder交叉验证
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6069731.html 参考网址: https://github.com/cmusatyalab/ope ...
- php统计文件夹大小
function dirsize($dir){ @$dh = opendir($dir); $size = 0; while($file = @readdir($dh)){ if($file!=&qu ...
- ssh-agent自启动加key脚本
公司使用到阿里云. 需要使用 ssh-agent forward 来跳转.为了方便自己就写了这个脚本 1 #!/bin/sh 2 # auto start ssh-agent and add key ...
- Alert方法重写
在正规项目中,总感觉alert框是非常难看的,但是有的时候又必须添加alert框来给用户一种警醒,废话不多说,先上图