最近尝试 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。

测试的方法很简单,用一个 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乱码的解决办法相关推荐

  1. ubuntu下文件名乱码的解决办法

    ubuntu下文件名乱码的解决办法 (2012-11-30 11:38:49) 转载▼ 标签: 终端 ubuntu it 分类:系统问题 ubuntu下文件名乱码的解决办法       最近一直在用u ...

  2. php excel中文名称乱码,phpexcel导出中文文件名乱码的解决办法

    使用phpexcel类库导出excel文件,文件名为中文时,在chrome浏览器下导出正常,在IE内核浏览器下导出文件名显示乱码,解决办法就是通过iconv函数转换编码,从utf-8转为gb2312, ...

  3. freetds php mssql 中文乱码,PHP读取mssql json数据中文乱码的解决办法

    PHP及网页使用UTF-8编码,数据库是sql server2008,使用默认编码(936,即GBK编码) 当读取数据库数据时,使用php自带的json_encode()返回到前端,结果中文不显示. ...

  4. redhat enterprise 5 在 VMware 6.5 中中文显示乱码的解决办法

    redhat enterprise 5 在 VMware 6.5 中中文显示乱码的解决办法 事情的经过是这样的 记得以前曾经在VMware 5.5.3 上装过redhat 估计是9吧 当初我选的是图形 ...

  5. php站中文转码在iis 7.5乱码,iis伪静态中文url出现乱码的解决办法

    首先要看下你安装的是IIS rewrite_2.0还是ISAPI_Rewrite 3.x的伪静态插件. 如果你安装的是IIS rewrite_2.0的话,传递的参数都是UTF-8格式的,如果你网站是G ...

  6. Loadrunner乱码的解决办法

    乱码出现的步骤 1.录制过程产生的乱码 2.运行过程编码不一致   录制的时候本机默认编码:GB2312,GBK,GB18030,而录制的网页有可能是uft-8编码 GB pk UTF-8 GB-X: ...

  7. EndNote导入文献出现带有大括号{}乱码的解决办法

    文章目录 1 EndNote导入文献出现带有大括号{}乱码的解决办法 3 EndNote X9 插入参考文献常见问题总结 4 EndNote X9 快速上手教程(毕业论文参考文献管理器) 1 EndN ...

  8. php 返回英文乱码,使用php 5时MySQL返回乱码的解决办法_php

    在使用 php 5 中,通过 mysql 查询得到的值全部成为 '???????',原来是字符集设错了. 我在安装 MySQL 5 时,已经选择默认字符集为 gb2312,但还是返回乱码,解决的办法是 ...

  9. R语言中导入excel乱码的解决办法

    本文操作系统环境为win10,使用Rstdio. 要说明windows下在使用Rstdio的时候,在使用xlsx包,导入excel表乱码的解决办法. 1.我们先安装xlsx包 install.pack ...

  10. php 0xef 0xbb 0xbf,utf-8编码的csv文件,用excel打开乱码,解决办法,在输出前加 0xEF,0xBB,0xBF三个char...

    转自 http://blog.csdn.net/zcmssd/article/details/6086649 是由于输出的CSV文件中没有BOM. 什么是BOM? 在UCS 编码中有一个叫做" ...

最新文章

  1. 2018-3-10 kKNN与K-mean的区别以及各自的Python代码(别人写的好的文章)
  2. linux线程下的读写锁
  3. 大数据凉了?No,流式计算浪潮才刚刚开始!
  4. junit 测试目录_JUnit 5测试中的临时目录
  5. 为应用程序池**提供服务的进程意外终止。进程ID是**。进程退出代码是'0x80'
  6. 计算机系统结构课程所设计总结,高级计算机系统结构-课程总结(13页)-原创力文档...
  7. linux下刻录光盘读取不了_Linux下刻录光盘实战
  8. python3 表情符号编码
  9. 101.接收上游响应的缓存处理流程
  10. M8TSC预览版0.5.1发布
  11. OpenSSL 介绍和使用
  12. Anaconda下载源设置及还原默认
  13. 渗透测试 ( 10 ) --- 扫描 web目录、文件 (dirb、wfuzz、wpscan、nikto)
  14. asp毕业设计——基于asp+access的车辆调度管理系统设计与实现(毕业论文+程序源码)——车辆调度管理系统
  15. 基于51单片机的指纹锁设计(附带密码解锁)
  16. NCRE考试感想 三级信息安全(上)
  17. 【ISO/IEC9126】ISO/IEC9126中软件质量模型品质介绍总结
  18. 通话质量好的蓝牙耳机有哪些?通话质量好的蓝牙耳机盘点
  19. ApacheCon Asia 2022 开启报名:Pulsar 技术议题重磅亮相
  20. 当年表白流行写情书,现在流行的是……

热门文章

  1. 服务器日志显示意外关闭,服务器多次异常关闭,错误日志:计算机已经从检测错误后重新启动。。检测错误: - Microsoft Community...
  2. 强大如斯的Bunch类
  3. 一句话,连上隔壁老王家的 WiFi !
  4. 30分钟了解PAC学习理论——计算学习理论第一讲
  5. python中sys模块下载_python模块:sys模块
  6. 在48小时内了解智能制造,让你少走弯路
  7. 中国Linux界的一些牛人(部分)
  8. 一年中所有节日的排列顺序_我国一年中的传统节日。(按顺序)
  9. C#针式打印机自定义纸张连续打印爬坑过程
  10. 把安卓手机屏幕投射到电脑上