Есть ли хотя бы быстрая реализация преобразования многобайтовой строки символов в строку Unicode wstring?

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

  •  23-09-2019
  •  | 
  •  

Вопрос

В моем проекте, где я применил алгоритм Ахо-Корасика для реализации режима фильтрации сообщений на стороне сервера, сообщение, полученное сервером, представляет собой строку многобайтовых символов.Но после нескольких тестов я обнаружил, что узким местом является преобразование между многобайтовой строкой и wstring в Юникоде.Сейчас я использую пару mbstowcs_s и wcstombs_s, на которую уходит почти 95% затрат времени на весь режим.Кроме того, я попробовал MultiByteToWideChar/WideCharToMultiByte, получил тот же результат.Поэтому мне интересно, есть ли какой-нибудь другой, более эффективный способ выполнить эту работу?Мой проект создан в VS2005, и преобразованная строка будет содержать китайские символы.Большое спасибо.

Нет правильного решения

Другие советы

Существует ряд возможностей.

Во-первых, что вы подразумеваете под «многобайтовым символом»?Вы имеете в виду UTF8 или систему ISO DBCS?

Если вы посмотрите на определения UTF8 и UTF16, там можно выполнить высокооптимизированное преобразование, вырвав биты «x» и переформатировав их.См. например http://www.faqs.org/rfcs/rfc2044.html говорит о UTF8<==>UTF32.Настройка на UTF16 будет простой.

Второй вариант может заключаться в полной работе в UTF16.Отобразите свою веб-страницу (или диалог пользовательского интерфейса или что-то еще) в UTF16 и таким образом получите пользовательский ввод.

Если ничего не помогает, существуют и другие строковые алгоритмы, кроме Ахо-Корасика.Возможно, поищите алгоритм, который работает с вашей исходной кодировкой.

Добавлено 29 января 2010 г.] См. http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt подробнее о преобразованиях, включая две реализации C mbtowc() и wctomb().Они предназначены для работы с произвольно большими wchar_ts.Если у вас есть только 16-битный wchar_ts, вы можете значительно упростить его.

Они будут намного быстрее, чем общие (чувствительные к кодовой странице) версии стандартной библиотеки.

Устарело (я считаю), но вы всегда можете использовать небезопасные версии (mbstowcs и wcstombs).Однако не уверен, что это приведет к заметному улучшению.В качестве альтернативы, если ваш набор символов ограничен (например, a-z, 0-9), вы всегда можете сделать это вручную с помощью таблицы поиска..?

Возможно, вы сможете уменьшить количество вызовов MultiByteToWideChar?

Вероятно, вы также могли бы использовать Aho-Corasick для работы непосредственно с многобайтовыми строками.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top