由于Unicode缺少一系列零宽度排序字符,我需要确定允许我强制按列表自动按字符值排序的某个顺序的等效字符。不幸的是,列表项不是按字母顺序排列,也不能用可见字符作为前缀,以确保排序结果符合所需结果。
在常规拉丁字母文本面前可以抛出哪些Unicode字符,并且不会出现,但仍允许我以我需要的方式“尖峰”排序?
(顺便说一句,这是使用Drupal 5和用户配置文件列表字段完成的。不要打扰将其更改为词汇/类别。)
答案 0 :(得分:5)
零宽度空间(U + 200B)应该可以做你想要的。来自Unicode规范:
零宽度空间。 U + 200B ZERO WIDTH SPACE表示换行机会,但它没有宽度。零宽度空格字符旨在用于没有可见字间距的语言,以表示换行机会,例如泰语,高棉语和日语。
应该是您遇到的大多数字体,但是YMMV。
答案 1 :(得分:1)
就个人而言,我更喜欢使用主要/次要排序键。它不那么笨拙,并且很容易在典型的sql查询中实现(ORDER BY column_a,column_b)。 编辑添加:在Php中,您可以使用usort(array, comparisonFunction)
和自定义比较功能添加额外的逻辑进行排序,如果您不能使用SQL来执行此操作。
但是,如果您只有一列可以使用并且不可修复,只需使用一定数量的不太可能的字符(如下划线)进行排序,然后在显示之前将其删除。 (使用正则表达式替换或类似)。
基于Unicode的黑客攻击在很大程度上取决于使用的字体,您正在使用的区域设置的排序/排序顺序,并且可能会对您无法控制的客户端产生不良副作用(不同的浏览器,不同的功能,不同的客户区域)。大多数“不可打印”的字符在没有支持它们的系统上显示时会产生“未知字符”,这通常看起来像一个空方块。有一些零宽度字符用于阿拉伯语等语言,但它们不应影响排序,除非在具有非常反常的Unicode支持的应用程序中。