再提 rhythmbox 等 gst 播放器中文乱码

Totem,mplayer,sopcast,realplayer,bmp
头像
huangjiahua
帖子: 3294
注册时间: 2005-03-30 0:27
送出感谢: 0
接收感谢: 1 次
联系:

再提 rhythmbox 等 gst 播放器中文乱码

#1

帖子 huangjiahua » 2009-03-21 20:13

本来是 linuxfire 的龙四大在 gst0.9 时候就解决了的问题,
但是 gst0.10 开始后, gst 的人突然文明用语决定“准迅标准”,愣是给干掉了,
后来 bugs.gnome.org 的管理员干脆看到类似 mp3 中文的 bug 报告就给干掉,
以致不再可能有机会将补丁弄回官方。

刚好 ff 问 DesktopCD 中文的事情,
于是我顺便弄了 gstreamer0.10_0.10.21 的补丁

这里暂时给出 Ubuntu810 下的解决。

需要修改的是 gst-plugins-good0.10 (gstreamer0.10-plugins-good)这个包,

补丁:

代码: 全选

--- gst-plugins-good0.10-0.10.10.4.old/gst/id3demux/id3v2frames.c	2008-07-19 21:16:02.000000000 +0800
+++ gst-plugins-good0.10-0.10.10.4/gst/id3demux/id3v2frames.c	2009-03-20 22:42:34.000000000 +0800
@@ -928,52 +928,105 @@ find_utf16_bom (gchar * data, const gcha
   return FALSE;
 }
 
+static void*
+string_utf8_dup (const gchar * start, const guint size)
+{
+  const gchar *env;
+  gsize bytes_read;
+  gchar *utf8;
+
+  /* Should we try the charsets specified
+   * via environment variables FIRST ? */
+  if (g_utf8_validate (start, size, NULL)) {
+    utf8 = g_strndup (start, size);
+    goto beach;
+  }
+
+  env = g_getenv ("GST_ID3V1_TAG_ENCODING");
+  if (!env || *env == '\0')
+    env = g_getenv ("GST_ID3_TAG_ENCODING");
+  if (!env || *env == '\0')
+    env = g_getenv ("GST_TAG_ENCODING");
+  if (!env || *env == '\0')
+    env = "UTF-8:GB2312:BIG5:GB18030:BIG5HKSCS:EUC-JP:EUC_KR:UTF-16";
+
+  /* Try charsets specified via the environment */
+  if (env && *env != '\0') {
+    gchar **c, **csets;
+
+    csets = g_strsplit (env, G_SEARCHPATH_SEPARATOR_S, -1);
+
+    for (c = csets; c && *c; ++c) {
+      if ((utf8 =
+              g_convert (start, size, "UTF-8", *c, &bytes_read, NULL, NULL))) {
+        if (bytes_read == size) {
+          g_strfreev (csets);
+          goto beach;
+        }
+        g_free (utf8);
+        utf8 = NULL;
+      }
+    }
+  }
+  /* Try current locale (if not UTF-8) */
+  if (!g_get_charset (&env)) {
+    if ((utf8 = g_locale_to_utf8 (start, size, &bytes_read, NULL, NULL))) {
+      if (bytes_read == size) {
+        goto beach;
+      }
+      g_free (utf8);
+      utf8 = NULL;
+    }
+  }
+
+  /* Try ISO-8859-1 */
+  utf8 =
+      g_convert (start, size, "UTF-8", "ISO-8859-1", &bytes_read, NULL, NULL);
+  if (utf8 != NULL && bytes_read == size) {
+    goto beach;
+  }
+
+  g_free (utf8);
+  return NULL;
+
+beach:
+
+  g_strchomp (utf8);
+
+  return (utf8);
+}
+
 static void
 parse_insert_string_field (guint8 encoding, gchar * data, gint data_size,
     GArray * fields)
 {
   gchar *field = NULL;
+  const gchar *in_encode;
 
   switch (encoding) {
     case ID3V2_ENCODING_UTF16:
+      in_encode = utf16enc;
+      break;
     case ID3V2_ENCODING_UTF16BE:
-    {
-      const gchar *in_encode;
-
-      if (encoding == ID3V2_ENCODING_UTF16)
-        in_encode = utf16enc;
-      else
-        in_encode = utf16beenc;
-
-      /* Sometimes we see strings with multiple BOM markers at the start.
-       * In that case, we assume the innermost one is correct. If that fails
-       * to produce valid UTF-8, we try the other endianness anyway */
+      in_encode = utf16beenc;
       while (data_size > 2 && find_utf16_bom (data, &in_encode)) {
         data += 2;              /* skip BOM */
         data_size -= 2;
-      }
-
-      field = g_convert (data, data_size, "UTF-8", in_encode, NULL, NULL, NULL);
-
-      if (field == NULL || g_utf8_validate (field, -1, NULL) == FALSE) {
-        /* As a fallback, try interpreting UTF-16 in the other endianness */
-        if (in_encode == utf16beenc)
-          field = g_convert (data, data_size, "UTF-8", utf16leenc,
-              NULL, NULL, NULL);
-      }
-    }
-
+      }      
       break;
     case ID3V2_ENCODING_ISO8859:
-      if (g_utf8_validate (data, data_size, NULL))
-        field = g_strndup (data, data_size);
-      else
-        field = g_convert (data, data_size, "UTF-8", "ISO-8859-1",
-            NULL, NULL, NULL);
+      in_encode = "ISO-8859-1";
       break;
     default:
-      field = g_strndup (data, data_size);
+      in_encode = "UTF-8";
       break;
+
+  if(!strcmp(in_encode, "ISO-8859-1"))
+    field = string_utf8_dup(data, data_size);
+  else {
+    field = g_convert (data, data_size, "UTF-8", in_encode, NULL, NULL, NULL);
+    if (!field)
+      field = string_utf8_dup(data, data_size);
   }
 
   if (field) {
@@ -987,7 +1040,7 @@ parse_insert_string_field (guint8 encodi
     g_free (field);
   }
 }
-
+}
 static void
 parse_split_strings (guint8 encoding, gchar * data, gint data_size,
     GArray ** out_fields)
deb 包
gstreamer0.10-plugins-good_0.10.10.4-1ubuntu1.1~gbk_i386.deb
打好补丁的 gstreamer0.10-plugins-good_0.10.10.4
(1.01 MiB) 下载 346 次
使用:
安装这个 deb,
然后加个环境变量 GST_ID3_TAG_ENCODING=GB18030:UTF-8 来启动 rhythmbox
可以执行

代码: 全选

sudo  sed  -i  's/Exec=rhythmbox/Exec=env GST_ID3_TAG_ENCODING=GB18030:UTF-8 rhythmbox/'     /usr/share/applications/rhythmbox.desktop 
来修改 rhythmbox 快捷方式。
跃过无数的时间断层,只为了在
jwdss
帖子: 10
注册时间: 2009-03-22 14:15
送出感谢: 0
接收感谢: 0

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#2

帖子 jwdss » 2009-03-22 14:44

不能安装啊
头像
dazedoracle
帖子: 43
注册时间: 2008-04-07 23:55
送出感谢: 0
接收感谢: 0

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#4

帖子 dazedoracle » 2009-03-22 16:49

好帖,且试试再说,不过不知有无解决部分pdf中文文档乱码的方法
头像
huangjiahua
帖子: 3294
注册时间: 2005-03-30 0:27
送出感谢: 0
接收感谢: 1 次
联系:

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#5

帖子 huangjiahua » 2009-03-22 17:06

jwdss 写了:不能安装啊
给出的 deb 是 Ubuntu 8.10 32 位版本的,

其他版本请使用给出的补丁重新编译
跃过无数的时间断层,只为了在
mimihu88
帖子: 551
注册时间: 2006-04-03 11:26
送出感谢: 0
接收感谢: 1 次

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#6

帖子 mimihu88 » 2009-03-22 19:51

晕,没有改成utf-8的显示是正常了,原来已经改为utf-8的全部变成问号,呜呼!

实际的原因不是很确定,因为有些转了,有些没有转,但是仍然有部分文件全是问号.
mimihu88
帖子: 551
注册时间: 2006-04-03 11:26
送出感谢: 0
接收感谢: 1 次

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#7

帖子 mimihu88 » 2009-03-22 20:52

重启电脑以后,问号全部消失了,再晕!
能正常显示中文了。
头像
速腾1994
论坛版主
帖子: 17363
注册时间: 2008-11-01 20:43
系统: Arch+gnome
送出感谢: 23 次
接收感谢: 8 次

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#8

帖子 速腾1994 » 2009-03-29 22:30

sudo rm /etc/fonts/conf.d/49-sansserif.conf
解决!
gaewah
帖子: 8
注册时间: 2009-02-19 16:55
送出感谢: 0
接收感谢: 0

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#9

帖子 gaewah » 2009-05-13 21:20

楼主太强了。。。
奇怪,这帖关注度怎么这么低呢?

还有,本来装了gstreamer0.10-plugins-good 0.10.14-1
为了装这个补丁还要降回gstreamer0.10-plugins-good 0.10.10
楼主能说下改了哪里吗?
头像
huangjiahua
帖子: 3294
注册时间: 2005-03-30 0:27
送出感谢: 0
接收感谢: 1 次
联系:

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#10

帖子 huangjiahua » 2009-05-13 22:33

直接用这 deb 应该没有问题(忽略降级提示),

反正这些各个小版本号都实际上是 gst0.10,
没大改动。

问改哪里直接看我给出的补丁呀。
跃过无数的时间断层,只为了在
头像
huangjiahua
帖子: 3294
注册时间: 2005-03-30 0:27
送出感谢: 0
接收感谢: 1 次
联系:

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#11

帖子 huangjiahua » 2009-06-17 21:43

最新补丁,适用于 0.10.22

debian/patches/06_gst-plugins-base_cjk.patch

代码: 全选

--- gst-plugins-base0.10-0.10.22/gst-libs/gst/tag/tags.c	2009-01-06 07:24:03.000000000 +0800
+++ gst-plugins-base0.10-0.10.22.new/gst-libs/gst/tag/tags.c	2009-06-17 21:42:39.000000000 +0800
@@ -293,6 +293,9 @@ gst_tag_freeform_string_to_utf8 (const g
 
     /* Try charsets specified via the environment */
     env = g_getenv (*env_vars);
+    if (!*(env_vars+1)) {
+      env = "UTF-8:GB2312:BIG5:GB18030:BIG5HKSCS:EUC-JP:EUC_KR:UTF-16";
+    }
     if (env != NULL && *env != '\0') {
       gchar **c, **csets;
跃过无数的时间断层,只为了在
头像
huangjiahua
帖子: 3294
注册时间: 2005-03-30 0:27
送出感谢: 0
接收感谢: 1 次
联系:

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#12

帖子 huangjiahua » 2009-06-17 22:29

904 的 deb 包可以从这儿获取

http://ppa.launchpad.net/hiweed-pkg/ppa ... -base0.10/
跃过无数的时间断层,只为了在
gaewah
帖子: 8
注册时间: 2009-02-19 16:55
送出感谢: 0
接收感谢: 0

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#13

帖子 gaewah » 2009-07-18 14:01

我是64位的9.04。
弄了很久还是不知道你的补丁怎么用。
我是菜鸟,
请问能不能详细说下你的补丁如何用,下了9.04的deb下哪个,下了后怎么办,谢了。
gaewah
帖子: 8
注册时间: 2009-02-19 16:55
送出感谢: 0
接收感谢: 0

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#14

帖子 gaewah » 2009-07-18 14:19

是不是下了12楼的deb包其他的补丁都不用了?
zhangchi100
帖子: 212
注册时间: 2006-11-17 9:53
送出感谢: 0
接收感谢: 0

Re: 再提 rhythmbox 等 gst 播放器中文乱码

#15

帖子 zhangchi100 » 2009-08-01 12:30

如果只是mp3标签问题,在windows下用foobar2000全部换成apev2的格式就好了,在linux下和windows下都不会乱码。
个人认为:apev2的标签格式是最好的
回复

回到 “影音多媒体”