Преобразование широкой строки символов в строчные в C ++ - PullRequest
6 голосов
/ 23 октября 2009

Как мне преобразовать строку wchar_t из верхнего регистра в строчный в C ++?

Строка содержит смесь символов японского, китайского, немецкого и греческого языков.

Я думал об использовании буксировщика ...

http://msdn.microsoft.com/en-us/library/8h19t214%28VS.80%29.aspx

.. но в документации сказано, что:

Конверсия буксировщика зависит от региона. В этом случае изменяются только символы, относящиеся к текущей локали.

Редактировать: Может быть, я должен описать, что я делаю. Я получаю поисковый запрос Unicode от пользователя. Первоначально он в кодировке UTF-8, но я конвертирую его в широкоформатный код (возможно, я ошибаюсь в формулировке). Мой отладчик (VS2008) правильно отображает символы «японский», «немецкий» и т. Д. В «переменном быстром просмотре». Мне нужно пройти через другой набор данных в Юникоде и найти совпадения строки поиска. Хотя это не проблема для меня, когда поиск чувствителен к регистру, более проблематично делать это без учета регистра. Мой (возможно, наивный) подход к решению проблемы состоял бы в том, чтобы преобразовать все входные и выходные данные в нижний регистр, а затем сравнить их.

Ответы [ 4 ]

9 голосов
/ 23 октября 2009

Если ваша строка содержит все эти символы, кодовый набор должен быть основан на Unicode. При правильной реализации Unicode (Глава 4 ' Свойства символов ') определяет свойства символов, включая то, является ли символ прописным и сопоставлением нижнего регистра и т. Д.

Учитывая эту преамбулу, функция towlower() из <wctype.h> является правильным инструментом для использования. Если он не справляется с работой, у вас есть проблема с QoI (качеством реализации), которую вы можете обсудить с вашим поставщиком. Если вы обнаружите, что поставщик не отвечает, посмотрите на альтернативные библиотеки. В этом случае вы можете рассмотреть ICU (Международные компоненты для Unicode).

3 голосов
/ 23 октября 2009

У вас в руках неприятная проблема. Японский язык не поможет конвертировать немецкий и наоборот. Существуют языки, в которых также нет понятия каптализации (toupper, и друзья, я полагаю, не будут здесь участвовать) Итак, вы можете разбить свою строку на отдельные куски слов из того же языка? Если вы можете, то можете преобразовать кусочки и натянуть их.

1 голос
/ 23 октября 2009

Этот ответ SO показывает, как работать с фасетами для работы с несколькими локалями. Если это в Windows, вы можете рассмотреть возможность использования функций Win32 API, если вы можете работать с C ++. NET (управляемый C ++), вы можете использовать функции char.ToLower и string.ToLower, которые совместимы с Unicode.

0 голосов
/ 23 октября 2009

Посмотрите на _wcslwr_l в <wchar.h> ( MSDN ).

Вы должны иметь возможность запускать функцию на входе для каждой из локалей.

...