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

时间:2020-03-06 14:54:29  来源:igfitidea点击:

由于Unicode缺少一系列零宽度的排序字符,因此我需要确定等效的字符,以使我可以对按字符值自动排序的列表施加一定的顺序。不幸的是,列表项不是按字母顺序排列的,也不可以给它们加上可见字符以确保排序结果与所需结果匹配。

哪些Unicode字符可以扔在常规拉丁字母文本的前面,并且不会出现,但仍然允许我以所需的方式"加粗"排序?

(顺便说一句,这是通过Drupal 5的用户个人资料列表字段完成的。不要费心建议将其更改为词汇表/类别。)

解决方案

就个人而言,我只喜欢使用主/次排序键。它不那么麻烦,并且在典型的sql查询(ORDER BY column_a,column_b)中易于实现。编辑添加:在Php中,可以使用带有自定义比较功能的usort(array,comparisonFunction)来添加其他用于排序的逻辑,如果我们不能使用SQL做到这一点。

但是,如果我们只需要处理一列并且无法修复,则只需在其前面加上一些不太可能的字符(例如下划线)进行排序,然后在显示它们之前将其剥离即可。 (使用正则表达式替换或者类似方法)。

基于Unicode的黑客将在很大程度上取决于所使用的字体,所使用的语言环境的排序规则/排序顺序,并且可能会对我们无法控制的客户端产生不良的副作用(不同的浏览器,不同的oses,不同的客户端区域设置) 。在不支持字符的系统上显示时,大多数"不可打印"字符会产生"未知字符",通常看起来像一个空的正方形。有一些零宽度字符用于阿拉伯语之类的语言,但是除非具有非常不正确的Unicode支持的应用程序,否则它们不应该影响排序。

零宽度空间(U + 200B)应该可以满足要求。根据Unicode规范:

Zero Width Space. The U+200B ZERO WIDTH SPACE indicates a line break opportunity, except that it has no width. Zero-width space characters are intended to be used in languages that have no visible word spacing to represent line break opportunities, such as Thai, Khmer, and Japanese.

应该是我们遇到的大多数字体,但应使用YMMV。