Есть ли хотя бы быстрая реализация преобразования многобайтовой строки символов в строку Unicode wstring?
Вопрос
В моем проекте, где я применил алгоритм Ахо-Корасика для реализации режима фильтрации сообщений на стороне сервера, сообщение, полученное сервером, представляет собой строку многобайтовых символов.Но после нескольких тестов я обнаружил, что узким местом является преобразование между многобайтовой строкой и 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 для работы непосредственно с многобайтовыми строками.