|
发表于 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却不是),这样一来,可能会导致从这之后所有的字符都乱了。
当然要实现这个函数本来的目的的话,那么需要先判断字符串的编码,而这会让这个函数变得非常复杂,而且效果也不见得会很好。所以,我觉得注释这个函数是比较好的一个方法。 |
|