2008-09-30 5 views
3

Comme Unicode ne dispose pas d'une série de caractères de tri de largeur zéro, j'ai besoin de déterminer des caractères équivalents qui me permettront de forcer un certain ordre sur une liste qui est automatiquement triée par des valeurs de caractères. Malheureusement, les éléments de la liste ne sont pas dans un ordre alphabétique, et il n'est pas acceptable de les préfixer avec des caractères visibles pour s'assurer que le résultat du tri correspond au résultat souhaité. Quels caractères Unicode peuvent être lancés devant le texte normal de l'alphabet latin, et n'apparaîtront pas, mais me permettront quand même de "pointer" le sort comme je le souhaite?Unicode Caractères pouvant être utilisés pour tromper un trieur de chaînes?

(BTW cela est fait avec Drupal 5 avec un champ de liste de profils d'utilisateur. Ne pas la peine de suggérer le changement que dans un vocabulaire/catégorie.)

Répondre

4

L'espace de largeur nulle (U + 200B) devrait probablement faire ce que vous voulez. De la spécification Unicode:

Espace de largeur nulle. L'ESPACE ZERO WIDTH U + 200B indique une opportunité de saut de ligne, sauf qu'il n'a pas de largeur. Les caractères d'espace de largeur nulle sont destinés à être utilisés dans des langues qui n'ont pas d'espacement de mots visible pour représenter les opportunités de saut de ligne, telles que le thaïlandais, le khmer et le japonais.

Devrait être dans la plupart des polices que vous rencontrez, mais YMMV.

+0

J'ai besoin de plus d'un seul personnage. Après tout, je l'utilise comme un moyen de trier une séquence de chaînes. Caractères non-espace avec ftw de largeur zéro. –

1

Personnellement, je préfère utiliser un tri primaire/secondaire clé. C'est moins kludgy, et facile à implémenter dans une requête sql typique (ORDER BY column_a, column_b). Édité pour ajouter: En PHP, vous pouvez utiliser usort(array, comparisonFunction) avec une fonction de comparaison personnalisée pour ajouter une logique supplémentaire pour le tri, si vous ne pouvez pas utiliser SQL pour faire l'affaire. Cependant, si vous n'avez qu'une colonne à utiliser et que vous ne pouvez pas la modifier, préfixez simplement un certain nombre de caractères improbables comme des caractères de soulignement pour le tri, puis déposez-les juste avant de les afficher. (en utilisant la substitution de regexp ou similaire).

Les hacks basés sur Unicode dépendent fortement des polices utilisées, de l'ordre de classement/tri que vous utilisez, et peuvent produire des effets secondaires indésirables sur les clients sur lesquels vous n'avez aucun contrôle (différents navigateurs, différents oses, différents paramètres régionaux du client). La plupart des caractères "non imprimables" donnent le "caractère inconnu" lorsqu'ils sont affichés sur des systèmes sans les supporter, ce qui ressemble généralement à un carré vide. Il y a des caractères de largeur nulle utilisés pour des langages comme l'arabe, mais ils ne devraient pas affecter le tri sauf dans les applications avec un support Unicode très pervers.

+0

Le traitement Unicode de PHP est-il tombé sous ce genre de très pervers? BTW le truc SQL n'aide pas du tout dans cette situation. –

+0

Je ne sais pas, parce que j'ai seulement utilisé Shift-Jis, EUC-JP ou ISO-8859-1 en php. Unicode ne résout pas plus que ASCII/Iso-8859-1; ce n'est pas le domaine d'un encodage. Cependant, _MyVal, __MyVal et ___MyVal vont trier différemment. – JasonTrue

+0

Il ne semble pas que le tri typique de php vous donne beaucoup autre chose que, en PHP6, un drapeau de locale. Cependant, si vous implémentez votre propre fonction de comparaison, vous pouvez utiliser usort et utiliser les règles de comparaison que vous voulez. – JasonTrue