Y at-il même la mise en œuvre rapide au sujet de chaîne de caractères multi-octets convertir en unicode wstring?

StackOverflow https://stackoverflow.com/questions/2145862

  •  23-09-2019
  •  | 
  •  

Question

Dans mon projet, où je algorithme adopté Aho Corasick pour faire un mode de filtrage de messages dans le côté serveur, le message le serveur a est une chaîne de caractères multi-octets. Mais après plusieurs essais, j'ai trouvé le goulot d'étranglement est la conversion entre chaîne de mulitbyte et unicode wstring. Ce que j'utilise est maintenant la paire de mbstowcs_s et wcstombs_s, qui prend près de 95% du temps coût du mode entier. De plus, je l'ai essayé MultiByteToWideChar / WideCharToMultiByte, il a juste le même résultat.  Donc, je me demande s'il y a une autre façon plus efficace de faire le travail? Mon projet est construit en VS2005, et la chaîne convertie contiendra des caractères chinois.   Merci beaucoup.

Pas de solution correcte

Autres conseils

Il y a un certain nombre de possibilités.

Tout d'abord, qu'est-ce que vous entendez par « caractères multi-octets »? Voulez-vous dire UTF8 ou un système ISO DBCS?

Si vous regardez la définition de la portée UTF8 et il UTF16 faire une conversion hautement optimisé, déchirant les morceaux « x » et les reformater. Voir par exemple http://www.faqs.org/rfcs/rfc2044.html parle de UTF8 <==> UTF32. Réglage pour UTF16 serait simple.

La deuxième option pourrait être de travailler tout à fait UTF16. Rendre votre page Web (ou l'interface utilisateur de dialogue ou autre) dans UTF16 et obtenir l'entrée utilisateur de cette façon.

Si tout le reste échoue, il Aare d'autres algorithmes de chaîne que Aho-Corasick. Peut-être chercher un algorithme qui fonctionne avec l'encodage d'origine.

[Ajouté 29-Jan-2010] Voir http://www.cl.cam. ac.uk/~mgk25/ucs/utf-8-history.txt pour en savoir plus sur les conversions, y compris deux implémentations C de mbtowc () et wctomb (). Ceux-ci sont conçus pour fonctionner avec wchar_ts arbitrairement grandes. Si vous avez juste wchar_ts 16 bits, vous pouvez simplifier beaucoup.

Ce serait beaucoup plus rapide que les versions génériques (code de pages sensibles) dans la bibliothèque standard.

dépréciée (je crois), mais vous pouvez toujours utiliser les versions non sûres (mbstowcs et wcstombs). Je ne sais pas si cela aura une nette amélioration cependant. Par ailleurs, si votre jeu de caractères est limité (a - z, 0 - 9, par exemple), vous pouvez toujours le faire manuellement avec une table de recherche ..

?

Peut-être que vous pouvez réduire le nombre d'appels à MultiByteToWideChar?

Vous pouvez également adopter probablement Aho-Corasick pour travailler directement sur les chaînes multi-octets.

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