C'è anche una rapida implementazione su stringa di caratteri multibyte convertire unicode wstring?
Domanda
Nel mio progetto, dove ho adottato algoritmo Aho-Corasick fare qualche modalità di filtro dei messaggi nel lato server, il messaggio del server ottenuto è una stringa di caratteri multibyte. Ma dopo alcuni test ho trovato il collo di bottiglia è la conversione tra stringhe mulitbyte e Unicode wstring. Quello che uso ora è la coppia di mbstowcs_s e wcstombs_s, che richiede tempo costo quasi il 95% di tutta la modalità. Inoltre, ho provato MultiByteToWideChar / WideCharToMultiByte, ha ottenuto lo stesso risultato. Quindi mi chiedo se c'è qualche altro modo più efficiente per fare il lavoro? Il mio progetto è costruito in VS2005, e la stringa convertita conterrà i caratteri cinesi. Grazie molto.
Nessuna soluzione corretta
Altri suggerimenti
Ci sono una serie di possibilità.
In primo luogo, che cosa si intende per "carattere multi-byte"? Vuoi dire UTF8 o un sistema ISO DBCS?
Se si guarda alla definizione di UTF8 e UTF16 c'è scopo di fare una conversione altamente ottimizzato, strappandogli i bit "x" e la riformattazione. Si veda ad esempio http://www.faqs.org/rfcs/rfc2044.html parla di UTF8 <==> UTF-32. Regolazione per UTF16 sarebbe semplice.
La seconda opzione potrebbe essere quella di lavorare completamente in UTF16. Rendere la vostra pagina Web (o una finestra di interfaccia utente o qualsiasi altra cosa) in UTF16 e ottenere l'input dell'utente in quel modo.
Se tutto il resto fallisce, c'è Aare altri algoritmi di stringa di Aho-Corasick. Forse cercare un algoritmo che funziona con la codifica originale.
[Aggiunto 29-Gen-2010] Vedere http://www.cl.cam. ac.uk/~mgk25/ucs/utf-8-history.txt per ulteriori conversioni, tra cui due implementazioni C di mbtowc () e wctomb (). Questi sono progettati per funzionare con arbitrariamente grandi wchar_ts. Se v'è solo wchar_ts a 16 bit, allora è possibile semplificare un sacco.
Questi sarebbero molto più veloce rispetto alle (code-page-sensibili) versioni generiche nella libreria standard.
deprecato (credo), ma si può sempre usare la versione non a sicure (mbstowcs e wcstombs). Non sono sicuro se questo avrà un netto miglioramento però. In alternativa, se il set di caratteri è limitato (a - z, 0-9, per esempio), si può sempre farlo manualmente con una tabella di ricerca ..
?Forse si può ridurre la quantità di chiamate al MultiByteToWideChar?
Si potrebbe anche probabilmente adottare Aho-Corasick di lavorare direttamente sulle stringhe multibyte.