Юникод Символы, которые можно использовать для обмана сортировщика строк? - PullRequest
5 голосов
/ 30 сентября 2008

Поскольку в Юникоде отсутствует серия символов сортировки нулевой ширины, мне нужно определить эквивалентные символы, которые позволят мне навязывать определенный порядок в списке, который автоматически сортируется по значениям символов. К сожалению, элементы списка расположены не в алфавитном порядке, и недопустимо добавлять к ним префиксы с видимыми символами, чтобы гарантировать, что результат сортировки соответствует желаемому результату.

Какие символы Юникода могут быть выброшены перед обычным текстом латинского алфавита и не будут появляться, но все же позволяют мне «подбирать» сортировку так, как мне нужно?

(Кстати, это делается в Drupal 5 с полем списка профилей пользователей. Не пытайтесь предложить изменить его на словарь / категорию.)

Ответы [ 2 ]

5 голосов
/ 30 сентября 2008

Пробел нулевой ширины (U + 200B), вероятно, должен делать то, что вы хотите. Из спецификации Unicode:

Пространство с нулевой шириной. НУЛЕВОЙ ПРОСТРАНСТВО U + 200B указывает на возможность разрыва строки, за исключением того, что он не имеет ширины. Символы пробела нулевой ширины предназначены для использования в языках, в которых отсутствует видимый интервал между словами для представления возможностей разрыва строки, таких как тайский, кхмерский и японский.

Должно быть в большинстве шрифтов, с которыми вы сталкиваетесь, но YMMV.

1 голос
/ 30 сентября 2008

Лично я предпочитаю использовать первичный / вторичный ключ сортировки. Это менее сложный и простой в реализации типичный запрос sql (ORDER BY column_a, column_b). Отредактировано для добавления : в Php вы могли бы использовать usort(array, comparisonFunction) с пользовательской функцией сравнения, чтобы добавить дополнительную логику для сортировки, если вы не можете использовать SQL для решения этой задачи.

Однако, если у вас есть только один столбец для работы, и это невозможно исправить, просто префикс с определенным количеством маловероятных символов, таких как символы подчеркивания, для сортировки, а затем удалите их непосредственно перед отображением. (используя подстановку регулярных выражений или аналогичные).

Хак на основе Unicode будет сильно зависеть от того, какие шрифты используются, какой порядок сортировки / сортировки локали вы используете, и может привести к нежелательным побочным эффектам на клиентах, которые вы не контролируете (разные браузеры, разные oses, разные клиентские локали). Большинство «непечатаемых» символов выдают «неизвестный символ» при отображении в системах без их поддержки, которые обычно выглядят как пустой квадрат. Для таких языков, как арабский, используются символы нулевой ширины, но они не должны влиять на сортировку, за исключением приложений с очень извращенной поддержкой Юникода.

...