近期尝试 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乱码的解决的方法的更多相关文章

  1. resin后台输出中文乱码的解决的方法!

    近期从tomcat移植到resin,发现这东西不错啊! 仅仅是后台输出时有时候中文会乱码. 如今找到resin后台输出中文乱码的解决的方法: 编辑conf/resin.con文件: <!--ja ...

  2. ubuntu14.04中 gedit 凝视能显示中文,而source insight中显示为乱码的解决的方法

    1.乱码显示情况: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcjc3NjgzOTYy/font/5a6L5L2T/fontsize/400/fill/ ...

  3. html里显示中文乱码的解决的方法

    在HTML开头统一规范下编码格式: <meta http-equiv="Content-Type" content="text/html; charset=utf- ...

  4. Rhythmbox中文乱码解决的方法

    转自:http://hi.baidu.com/morgensonne/item/3470aef58747abde6325d2d9 今天在网络上找到了一个比較好的解决Rhythmbox中文乱码的问题的方 ...

  5. linux下打开txt显示乱码的解决方法

    Linux打开txt文件乱码的解决方法   Linux显示在Windows编辑过的中文就会显示乱码是由于两个操作系统使用的编码不同所致.Linux下使用的编码是utf8,而Windows使用的是gb1 ...

  6. Asp.net导出Excel乱码的解决方法

    通过跟踪Asp.net服务器代码,没有乱码,然而导出Excel到浏览器后,打开时出现乱码. 解决方法是添加编码格式的前缀字节码:Response.BinaryWrite(System.Text.Enc ...

  7. Mysql命令行中文乱码的解决方法

    环境:Windows 8 64位,Mysql  5.0.96 for Win64 (x86) 数据库本身安装时默认已经是使用utf8编码的了,但在命令行中执行查询时,查询到的中文依然乱码,解决方法如下 ...

  8. ECSHOP编辑器Fckeditor上传图片中文名称乱码的解决方法

    ECSHOP编辑器Fckeditor上传图片中文名称乱码的解决方法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2015-02-11   中文名乱码是因为:FCKed ...

  9. 用c#读取文件内容中文是乱码的解决方法:

    用c#读取文件内容中文是乱码的解决方法: //方法1: StreamReader din = new StreamReader(@"C:\1.txt", System.Text.E ...

随机推荐

  1. [计算机组成原理][实验十.R-I-J型指令CPU设计实验总结]

    总算解决一大心头之患了,比想象中容易,通宵两夜,刷完了十个实验,这个实验就是最后的了.感慨颇多.特地写篇总结. 想做一件事,就立马去做把.你会发现没那么困难,往往最大的困难,是心里的困难. 培养了HD ...

  2. React初步

    今天整理一下自己关于react的学习笔记. 什么是React? 学习某一个框架首先得知道这个框架是干什么的,它的特点是什么,有哪些优点和缺点. React有4个特点 组件化 虚拟DOM 单项数据流 j ...

  3. Eclipse下绿色安装插件Aptana、Swing

    本文主要针对Ecplise下绿色安装插件,写本篇博客也是因为笔者在Ecplise下安装Aptana时不断安装出现错误,所以写下自己安装成功以及之前出错的原因,也搜集了许多资料在此一并总结一下吧! Ec ...

  4. js 操作剪切板

    1.IE浏览器 window.clipboardData: setData() //设置值 getData()//获取值 clearData()//删除值 /******* ** IE 浏览器下支持w ...

  5. 诡异的SpriteKit 游戏查错

    在Endless Runner 游戏中,做了一些atlas后,发现有个问题,当player跳跃起来的时候,发现他没有动画了,被默认的X图片代替.原来的图像是这样的. 在增加了一些动画后,我的效果就成这 ...

  6. IOS网络开发实战(二)

      1 飞机航班查询软件 1.1 问题 NSURLConnection是IOS提供的用于处理Http协议的网络请求的类,可以实现同步请求也可以实现异步请求,本案例使用NSURLConnection类实 ...

  7. C#中KeyDown和KeyPress区别

    1.比如说TexBox 输入'a' 按下->触发KeyDown事件,然后去处理 ->将a显示输入到文本框后 ->触发KeyPress事件

  8. GDB调试一

    http://blog.csdn.net/haoel/article/details/2881 GDB主要调试的是C/C++的程序.要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行 ...

  9. T-SQL语句——UNION, EXCEPT, INTERSECT

    UNION,EXCEPT, INTERSECT关键字用于对集合的查询,它们的作用分别为: UNION:合并两个或多个 SELECT 语句的结果集,并把重复结果去除: UNIONALL:合并两个或多个 ...

  10. EasyShortcut Easyshortcut easyShortcut 简介

    关于EasyShortcut Easyshortcut easyShortcut 简介: 参考: http://chunsheng.me/EasyShortcut/