+ -
当前位置:首页 → 问答吧 → 为何hal无法探测出NTFS/FAT分区的中文标签?

为何hal无法探测出NTFS/FAT分区的中文标签?

时间:2009-10-06

来源:互联网

我使用的是KDE 4.3 。在 kubuntu/freebsd 中,都可以探测出我的NTFS/FAT分区的中文标签,可是在archlinux 中却探测不出中文标签,只是显示"5555"之类的数字。
请问怎么解决?

作者: ashmer   发布时间: 2009-10-06

引用:
作者: ashmer
我使用的是KDE 4.3 。在 kubuntu/freebsd 中,都可以探测出我的NTFS/FAT分区的中文标签,可是在archlinux 中却探测不出中文标签,只是显示"5555"之类的数字。
请问怎么解决?
在archlinux 使用src/hal-0.5.13/hald/linux/probing/probe-volume.c
freebsd 下可能使用src/hal-0.5.13/hald/freebsd/probing/probe-volume.c

作者: 沙漠之子   发布时间: 2009-10-06

引用:
作者: 沙漠之子
在archlinux 使用src/hal-0.5.13/hald/linux/probing/probe-volume.c
freebsd 下可能使用src/hal-0.5.13/hald/freebsd/probing/probe-volume.c
与hal的代码无关吧?同学的kubuntu中也是能够正确检测出中文标签的。

不清楚是哪里的配置问题。

作者: ashmer   发布时间: 2009-10-06

引用:
作者: ashmer
与hal的代码无关吧?同学的kubuntu中也是能够正确检测出中文标签的。

不清楚是哪里的配置问题。
那你去卡看看ubuntu的patch http://patches.ubuntu.com/h/hal/hal_...1ubuntu2.patch

作者: 沙漠之子   发布时间: 2009-10-06

可能是因为你编译bsd内核的时候选择了默认编码

作者: jarryson   发布时间: 2009-10-06

用ubuntu的hal源文件和补丁编译 安装后也不行
难道还跟src/hal-0.5.13/debian/下的东东有关??

还有在hal在ubuntu的依赖信息中有
freebsd-utils

文件来自
https://launchpad.net/ubuntu/+source/hal

作者: 沙漠之子   发布时间: 2009-10-06

同样是这样的问题。记得1个多月前是可以的,以前是可以探测出如“DATA_数据2"之类的,但现在都是“DATA_551”之类的标签了。各位可以用#lshal来查一下你们的hal探测的中文标签正常不?

作者: luyaotang   发布时间: 2009-10-06

引用:
作者: luyaotang
同样是这样的问题。记得1个多月前是可以的,以前是可以探测出如“DATA_数据2"之类的,但现在都是“DATA_551”之类的标签了。各位可以用#lshal来查一下你们的hal探测的中文标签正常不?
早试过不行的

作者: 沙漠之子   发布时间: 2009-10-06

在src/hal-0.5.13/hald/linux/probing/probe-volume.c中有关赋值volume_label的代码如下
PHP 代码:
      if (label[0] != '\0') {
            char *volume_label;

            /* we need to be sure for a utf8 valid label, because dbus accept only utf8 valid strings */
            volume_label = strdup_valid_utf8 (label);
            if( volume_label != NULL ) {
                  libhal_changeset_set_property_string (cs, "volume.label", volume_label);
                  HAL_DEBUG(("volume.label = '%s'", volume_label));

                  if (volume_label[0] != '\0') {
                        libhal_changeset_set_property_string (cs, "info.product", volume_label);
                        g_free(volume_label);
                        return;
                  }

                  g_free(volume_label);
            }
      } 
PHP 代码:
static gchar *
strdup_valid_utf8 (const char *str)
{
      char *endchar;
      char *newstr;
      unsigned int fixes;

      if (str == NULL)
            return NULL;

      newstr = g_strdup (str);

      fixes = 0;
      while (!g_utf8_validate (newstr, -1, (const char **) &endchar)) {
            *endchar = '_';
            ++fixes;
      }

      /* If we had to fix more than 20% of the characters, give up */
      if (fixes > 0 && g_utf8_strlen (newstr, -1) / fixes < 5) {
          g_free (newstr);
          newstr = g_strdup("");
      }

      return newstr;

作者: 沙漠之子   发布时间: 2009-10-30

热插拔U判是label 赋值的代码以找到
/src/hal-0.5.13/hald/linux/blockdev.c
PHP 代码:
        volume_label = strdup_valid_utf8 (hotplug_event->sysfs.fslabel);
        if (volume_label) {
                    hal_device_property_set_string (d, "volume.label", volume_label);
            if (volume_label[0] != '\0') {
                        hal_device_property_set_string (d, "info.product", volume_label);
            }
            g_free(volume_label);
        } 
将volume_label = strdup_valid_utf8 (hotplug_event->sysfs.fslabel);改为
volume_label = g_convert (hotplug_event->sysfs.fslabel, 255, "UTF-8", "GBK", NULL, NULL, NULL);
初步实现 中文标签 但是不完整

比如我的u盘fat16的卷标:沙漠之子
最后显示为:沙漠之73

HTML 代码:
 $ -> lshal |grep 沙漠
 info.product = '沙漠之73' (string)
 volume.label = '沙漠之73' (string)
 volume.mount_point = '/media/沙漠之73' (string)
搞不懂是为什么

有能力的大大们也来帮忙研究一下亚

作者: 沙漠之子   发布时间: 2009-10-31