近期尝试 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. 【Linux】linux经常使用基本命令

    Linux中很多经常使用命令是必须掌握的,这里将我学linux入门时学的一些经常使用的基本命令分享给大家一下,希望能够帮助你们. 这个是我将鸟哥书上的进行了一下整理的,希望不要涉及到版权问题. 1.显 ...

  2. WebApi2官网学习记录---Media Formatters

    Web API内建支持XML.JSON.BSON.和form-urlencoded的MiME type. 创建的自定义MIME类型要继承一下类中的一个: MediaTypeFormatter 这个类使 ...

  3. (转)怎样查看局域网中自己的IP地址和其他电脑的IP地址?

    开始菜单->运行->打cmd,回车->再弹出的黑框里打ipconfig -all,回车显示的IP Address就是你的ip地址看局域网的电脑的ip用软件比较方便,比如p2p终结者, ...

  4. Android -------- API等级

      API等级 Android版本 代号名称(基本上是按ABC命名排序的) 注释说明 1 Android 1.0     2 Android 1.1 Petit Four   3 Android 1. ...

  5. eclipse 连接手机的 核心解决办法

    重启adb的方法  根本不是最本质的方法 最本质的问题 ,一句话概括 : 没安装好驱动呗! 下面是转载的 android开发一般用到的开发工具就是eclipe,而安卓手机则用来调试程序.一般新手在建立 ...

  6. python学习(四)五数连珠

    中午有段时间,模仿<五子连珠>写了一段代码,运行截图如下: import random # for random.randrange() import os # for input() b ...

  7. poj 1037 A decorative fence

    题目链接:http://poj.org/problem?id=1037 Description Richard just finished building his new house. Now th ...

  8. WordPress插件开发记录

    1.a标签在新的网页中打开内容     <a href="网址" target="_blank"></a>      2.PDO的$re ...

  9. Chrome小技巧:如何下载离线版安装文件

    每当chrome有更新之后,都有不少用户想要下载离线版的安装文件,但苦于找不到下载地址而发愁,其实这个问题很简单,下面我来分享一下方法(仅针对Windows操作系统): 对于稳定版(正式版)Chrom ...

  10. ActiveX in QT

    http://doc.qt.io/qt-4.8/activeqt.htmlhttp://doc.qt.io/qt-5/activeqt-index.html