Преобразование широкой строки char в нижний регистр в C++

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

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

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

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

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

конверсия случае towlower это локали. Только символы, относящиеся к текущая локаль изменяется в случае.

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

4 ответов


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

учитывая эту преамбулу, с <wctype.h> является правильным инструментом для использования. Если это не делает работу, у вас есть проблема QoI (качество реализации) для обсуждения с вашим поставщиком. Если поставщик не отвечает, обратитесь к альтернативным библиотекам. В этом случае вы можете рассмотреть ОИТ (международные компоненты для Unicode).


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


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


посмотреть _wcslwr_l на <wchar.h> (MSDN).

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