代码之家  ›  专栏  ›  技术社区  ›  Chris Charabaruk

可以用来欺骗字符串排序器的Unicode字符?

  •  4
  • Chris Charabaruk  · 技术社区  · 16 年前

    由于Unicode缺少一系列零宽度排序字符,因此我需要确定等效字符,以便在自动按字符值排序的列表上强制执行特定顺序。不幸的是,列表项不是按字母顺序排列的,也不接受在它们前面加上可见字符以确保排序结果与所需结果匹配。

    哪些unicode字符可以在常规的拉丁字母文本前面被抛出,并且不会出现,但是仍然允许我按照我需要的方式“加钉”排序?

    (顺便说一句,这是通过Drupal5和用户配置文件列表字段完成的。不要费心建议把它改成词汇/类别。)

    2 回复  |  直到 15 年前
        1
  •  5
  •   Joe Hildebrand    16 年前

    零宽度空间(U+200B)应该可以满足您的需要。从Unicode规范:

    零宽度空间。U+200B零宽度空间表示换行机会,但它没有宽度。零宽度空格字符用于没有可见单词间距的语言,以表示换行机会,如泰语、高棉语和日语。

    应该是在你遇到的大多数字体,但ymmv。

        2
  •  1
  •   JasonTrue    16 年前

    就个人而言,我更喜欢使用主/次排序键。它不那么笨拙,而且易于在典型的SQL查询中实现(按列排序,按列排序)。 编辑添加 :在PHP中,可以使用 usort(array, comparisonFunction) 如果您不能使用SQL来完成这个技巧,那么可以使用自定义的比较函数来添加额外的逻辑来进行排序。

    但是,如果您只有一列要处理,而且这是不可修复的,那么只需在其前面加上一些不太可能的字符,如用于排序的下划线,然后在显示它们之前将它们删除。(使用regexp替换或类似方法)。

    基于Unicode的黑客将严重依赖于所使用的字体、所使用的区域设置的排序顺序,并且可能会对您无法控制的客户机(不同的浏览器、不同的操作系统、不同的客户机区域设置)产生不良的副作用。大多数“不可打印”字符在不支持它们的系统上显示时都会产生“未知字符”,这通常看起来像一个空的正方形。有些零宽度的字符用于阿拉伯语等语言,但它们不应影响排序,除非在支持非常反常的Unicode的应用程序中。