Question

J'ai un problème face à une simple recherche d'une chaîne de deux caractères unicode (l'aiguille) dans une autre chaîne (la botte de foin) qui peuvent ou peuvent ne pas être UTF-8

Une partie du problème est que je ne sais pas comment spécifier le code à utiliser dans strpos, et je ne sais pas si PHP doit être compilé avec un support spécial pour le code, ou si je dois utiliser mb_strpos que je suis en train d'éviter, car il pourrait aussi ne pas être disponible.

ie. par exemple l'aiguille est U+56DE U+590D (sans espace)

Avec preg_match il pourrait être preg_match("@\x{56DE}\x{590D}@",$haystack) mais qui exige en fait @u qui pourrait ne pas être disponible et je reçois un Compilation failed: character value in \x{...} sequence is too large de toute façon.

Je ne veux pas utiliser preg_match de toute façon car il pourrait être beaucoup plus lent que strpos (il y a d'autres séquences qui doivent être examinées).

Puis-je convertir U+56DE U+590D dans sa séquence d'un seul octet (peut-être 5-6 caractères) puis rechercher via strpos? Je ne peux pas comprendre comment le convertir en octets le cas échéant.

Comment spécifier en ligne unicode en PHP de toute façon? Je veux dire en dehors de PRCE?

$blah="\u56DE\u590D"; ne fonctionne pas?

Merci pour toutes les idées!

Était-ce utile?

La solution

Tout d'abord, votre question est mal structuré. Il a plusieurs questions à plusieurs points. Vous auriez probablement obtenir plus de réponses si vous avez utilisé une structure plus claire: 1) décrire la tâche que vous essayez d'accomplir, 2) les limites / exigences, 3) la stratégie que vous considéré, 4) les difficultés que vous avez trouvé avec une telle stratégie / est-il un meilleur.

Cela dit, je vais commencer par la fin:

  

$blah="\u56DE\u590D"; ne fonctionne pas?

Non

. La langue ne sait rien au sujet unicode. En PHP, les chaînes sont des tableaux d'octets. Par conséquent, comment vous exprimez un des points de code unicode dans un script PHP dépend de l'encodage que vous souhaitez utiliser. Pour UTF-8, il serait "\xE5\x9B\x9E\xE5\xA4\x8D", UTF-16 big endian serait "\x56\xDE\x59\x0D", et ainsi de suite.

  

Puis-je convertir U+56DE U+590D dans sa séquence d'un seul octet (peut-être 5-6 caractères) et puis recherchez via strpos? Je ne peux pas comprendre comment le convertir en octets le cas échéant.

Pour la première partie, oui, à savoir, la conversion U+56DE U+590D en octets, une clarification est nécessaire. Sont ces unités de code UTF-16 ou Unicode points de code? Par exemple, comment est représenté 𪛖? U+D869 U+uDED6 ou U+2A6D6? Si ce sont des unités de code unicode, il est trivial de les encoder en UTF-16. Pour UTF-16 big endian, il est juste "\x56\xDE\x59\x0D". Dans le cas contraire, il est toujours trivial de coder les UTF-32, mais il faut un peu plus de travail à faire de même en UTF-16 (ou UTF-8).

Pour la deuxième partie, continuez à lire.

  

Une partie du problème est que je ne sais pas comment spécifier le code à utiliser dans strpos, et je ne sais pas si PHP doit être compilé avec un support spécial pour le code, ou si je dois utiliser mb_strpos que je suis en train d'éviter, car il pourrait aussi ne pas être disponible.

Qu'est-ce que vous essayez de faire? Pourquoi avez-vous besoin de trouver une position dans une chaîne? strpos vous donnera un décalage d'octet pour une chaîne donnée (encore une fois, interprété sous forme binaire). Essayez-vous de couper une chaîne? strpos (ou même mb_strpos) de la difficulté moyenne en Unicode - un glyphe peuvent être constitués par plusieurs unités de code, de sorte que vous risquez de clipping partie d'un glyphe. Je ne peux pas vous conseiller plus à moins que vous dire ce que vous essayez de faire.

Autres conseils

Vous avez écrit "pourrait ne pas être disponible. Je vous suggère d'essayer mb_strpos .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top