LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1040|回复: 3

支持中文 ID3 的 Mp3blaster

[复制链接]
发表于 2008-1-2 11:23:47 | 显示全部楼层 |阅读模式
从 LinuxToy 上面看见关于 Mp3blaster 的介绍,但是有很多兄弟反应他不支持中文 ID3。由于这个问题我以前也碰到过,而且是已经解决了的,下面说说我的解决的办法。

包路径下有个 src/id3parse.cc 文件,里面有一个函数如下:

/* tampers with 's' to replace non-printable chars with dots. */
void
convert_to_sane_string(char *s)
{
    unsigned int
        cnt = strlen(s),
        i;

    for (i = 0; i < cnt; i++)
    {
        if (s < (char)32)
            s = '.';
    }
}

它的主要问题就是 strlen 不支持多字符集(比如中文),所以都将中文转换成了 '.'(点) 。而本身这个函数就起到一个过滤的功能,所以加上多字符集的判断(Multibyte String)我个人感觉没有必要,就直接注释掉了。

最后发现中文 ID3 就可以正常显示了(手气真的不错)。下面是一个效果图一张:



最后,提供我修改后的代码打包下载: http://www.gracecode.com/Archive/Display/526
发表于 2008-1-3 12:16:45 | 显示全部楼层
Post by AMD-K6;1802225
从 LinuxToy 上面看见关于 Mp3blaster 的介绍,但是有很多兄弟反应他不支持中文 ID3。由于这个问题我以前也碰到过,而且是已经解决了的,下面说说我的解决的办法。

包路径下有个 src/id3parse.cc 文件,里面有一个函数如下:

/* tampers with 's' to replace non-printable chars with dots. */
void
convert_to_sane_string(char *s)
{
    unsigned int
        cnt = strlen(s),
        i;

    for (i = 0; i < cnt; i++)
    {
        if (s < (char)32)
            s = '.';
    }
}

它的主要问题就是 strlen 不支持多字符集(比如中文),所以都将中文转换成了 '.'(点) 。而本身这个函数就起到一个过滤的功能,所以加上多字符集的判断(Multibyte String)我个人感觉没有必要,就直接注释掉了。

最后发现中文 ID3 就可以正常显示了(手气真的不错)。下面是一个效果图一张:



最后,提供我修改后的代码打包下载: http://www.gracecode.com/Archive/Display/526


我看问题并非在strlen函数,这个函数本身无所谓支持不支持多字符集。它只是数一下从字符串的开始到结束的字节数(不一定是字数)。从你给出的信息看,我猜问题出在后面的替换,把所有编码在32以下的字符都替换成"."了。对于ASCII码来说,小于32的字符串是不可显示的,但是对于其他语言来说,它可能是其中一个字符的一部分,所以就它替换掉就必然会使这个字符串变得混乱了。特别是对一些不能自动纠错的编码(印象中GB*系列编码就是,UTF-8却不是),这样一来,可能会导致从这之后所有的字符都乱了。

当然要实现这个函数本来的目的的话,那么需要先判断字符串的编码,而这会让这个函数变得非常复杂,而且效果也不见得会很好。所以,我觉得注释这个函数是比较好的一个方法。
回复 支持 反对

使用道具 举报

发表于 2008-1-4 13:05:20 | 显示全部楼层
我不知道谁对谁错!

但事实证明!
这个修改无法解决我的问题!还是有乱码!
努力寻找CLI的player!
回复 支持 反对

使用道具 举报

发表于 2008-1-4 13:11:32 | 显示全部楼层
如果不过滤字符,一般中文id3都是gb编码的,如果系统是这样的编码,是可以正常显示中文id3信息的。不过,不过系统locale是utf8,就需要在源代码里做转换了。我的mpg123和mplayer都是打了编码转换的补丁的,用着问题不大。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表