Existe até uma implementação rápida sobre a sequência de caracteres multibytes convertida para unicode wstring?

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

  •  23-09-2019
  •  | 
  •  

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top