Existe até uma implementação rápida sobre a sequência de caracteres multibytes convertida para unicode wstring?
Pergunta
No meu projeto, onde adotei o algoritmo AHO-corasick para fazer algum modo de filtro de mensagens no lado do servidor, a mensagem que o servidor recebeu é a sequência de caracteres multibyte. Mas, após vários testes, descobri que o gargalo é a conversão entre a corda Mulitbyte e o Unicode WString. O que eu uso agora é o par de mbstowcs_s e wcstombs_s, que leva quase 95% de custo de todo o modo. Além disso, tentei multibytetowidechar/widechartomultibyte, ele obteve o mesmo resultado. Então, eu me pergunto se há outra maneira mais eficiente de fazer o trabalho? Meu projeto é construído no VS2005 e a string convertida conterá caracteres chineses. Muito Obrigado.
Nenhuma solução correta
Outras dicas
Existem várias possibilidades.
Em primeiro lugar, o que você quer dizer com "personagem de vários bytes"? Você quer dizer UTF8 ou um sistema DBCS ISO?
Se você observar a definição de UTF8 e UTF16, há um escopo para fazer uma conversão altamente otimizada, arrancando os bits "X" e reformatando -os. Veja, por exemplo http://www.faqs.org/rfcs/rfc2044.html fala sobre utf8 <==> utf32. Ajustar para o UTF16 seria simples.
A segunda opção pode ser trabalhar inteiramente no UTF16. Renderize sua página da web (ou diálogo da interface do usuário ou qualquer outra coisa) no UTF16 e obtenha a entrada do usuário dessa maneira.
Se tudo mais falhar, há outros algoritmos de string que o AHO-corasick. Possivelmente procure um algoritmo que funcione com sua codificação original.
Adicionado 29-Jan-2010] Ver http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt Para mais informações sobre conversões, incluindo duas implementações C de MBTOWC () e WCTomb (). Eles foram projetados para funcionar com arbitrariamente grandes wchar_ts. Se você possui apenas 16 bits wchar_ts, poderá simplificá-lo muito.
Estas seriam muito mais rápidas do que as versões genéricas (sensíveis à página de código) na biblioteca padrão.
Depreciado (acredito), mas você sempre pode usar as versões não seguras (MBstowcs e WCStombs). Não tenho certeza se isso terá uma melhoria acentuada. Como alternativa, se o seu conjunto de personagens for limitado (a - z, 0 - 9, por exemplo), você sempre poderá fazê -lo manualmente com uma tabela de pesquisa ..?
Talvez você possa reduzir a quantidade de chamadas para o multibytetowidechar?
Você provavelmente também pode adotar o AHO-Corasick para trabalhar diretamente em cordas multibytes.