Есть ли быстрая реализация преобразования многобайтовой символьной строки в кодировку Unicode? - PullRequest
3 голосов
/ 27 января 2010

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

Ответы [ 4 ]

1 голос
/ 27 января 2010

Существует несколько возможностей.

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

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

Второй вариант - полностью работать в UTF16.Визуализируйте свою веб-страницу (или UI Dialog или что-то еще) в UTF16 и получите ввод данных пользователем таким образом.

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

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

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

0 голосов
/ 27 января 2010

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

0 голосов
/ 27 января 2010

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

0 голосов
/ 27 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...