当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 16 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-03-21 20:13 
头像

注册: 2005-03-30 0:27
帖子: 3294
送出感谢: 0 次
接收感谢: 2
本来是 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
gstreamer0.10-plugins-good_0.10.10.4-1ubuntu1.1~gbk_i386.deb [1.01 MiB]
被下载 345 次

使用:
安装这个 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 快捷方式。


_________________
跃过无数的时间断层,只为了在


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-03-22 14:44 

注册: 2009-03-22 14:15
帖子: 10
送出感谢: 0 次
接收感谢: 0 次
不能安装啊


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-03-22 16:13 
头像

注册: 2008-04-26 12:41
帖子: 10974
送出感谢: 11
接收感谢: 38
早已抛弃之 :em09


_________________
[新手必读]wubi安装常见问题(FAQ)
[分享]装双系统的同学必看——Windows与Linux系统共享交换分区的方法
kde下唯美的暗黑内透主题(无需编译)
无穷老机上的Trinity Desktop Environment


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-03-22 16:49 
头像

注册: 2008-04-07 23:55
帖子: 43
送出感谢: 0 次
接收感谢: 0 次
好帖,且试试再说,不过不知有无解决部分pdf中文文档乱码的方法


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-03-22 17:06 
头像

注册: 2005-03-30 0:27
帖子: 3294
送出感谢: 0 次
接收感谢: 2
jwdss 写道:
不能安装啊


给出的 deb 是 Ubuntu 8.10 32 位版本的,

其他版本请使用给出的补丁重新编译


_________________
跃过无数的时间断层,只为了在


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-03-22 19:51 

注册: 2006-04-03 11:26
帖子: 551
送出感谢: 0 次
接收感谢: 1
晕,没有改成utf-8的显示是正常了,原来已经改为utf-8的全部变成问号,呜呼!

实际的原因不是很确定,因为有些转了,有些没有转,但是仍然有部分文件全是问号.


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-03-22 20:52 

注册: 2006-04-03 11:26
帖子: 551
送出感谢: 0 次
接收感谢: 1
重启电脑以后,问号全部消失了,再晕!
能正常显示中文了。


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-03-29 22:30 
头像

注册: 2008-11-01 20:43
帖子: 17322
系统: 自动检测比较好
送出感谢: 44
接收感谢: 11
sudo rm /etc/fonts/conf.d/49-sansserif.conf
解决!


_________________
谁是我?KL.Uiq8 YinMeng


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-05-13 21:20 

注册: 2009-02-19 16:55
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
楼主太强了。。。
奇怪,这帖关注度怎么这么低呢?

还有,本来装了gstreamer0.10-plugins-good 0.10.14-1
为了装这个补丁还要降回gstreamer0.10-plugins-good 0.10.10
楼主能说下改了哪里吗?


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-05-13 22:33 
头像

注册: 2005-03-30 0:27
帖子: 3294
送出感谢: 0 次
接收感谢: 2
直接用这 deb 应该没有问题(忽略降级提示),

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

问改哪里直接看我给出的补丁呀。


_________________
跃过无数的时间断层,只为了在


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-06-17 21:43 
头像

注册: 2005-03-30 0:27
帖子: 3294
送出感谢: 0 次
接收感谢: 2
最新补丁,适用于 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;


_________________
跃过无数的时间断层,只为了在


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-06-17 22:29 
头像

注册: 2005-03-30 0:27
帖子: 3294
送出感谢: 0 次
接收感谢: 2
904 的 deb 包可以从这儿获取

http://ppa.launchpad.net/hiweed-pkg/ppa ... -base0.10/


_________________
跃过无数的时间断层,只为了在


页首
 用户资料  
 
13 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-07-18 14:01 

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


页首
 用户资料  
 
14 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-07-18 14:19 

注册: 2009-02-19 16:55
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
是不是下了12楼的deb包其他的补丁都不用了?


页首
 用户资料  
 
15 楼 
 文章标题 : Re: 再提 rhythmbox 等 gst 播放器中文乱码
帖子发表于 : 2009-08-01 12:30 

注册: 2006-11-17 9:53
帖子: 212
送出感谢: 0 次
接收感谢: 0 次
如果只是mp3标签问题,在windows下用foobar2000全部换成apev2的格式就好了,在linux下和windows下都不会乱码。
个人认为:apev2的标签格式是最好的


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 16 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译