Преобразование широкой строки 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).
вы должны иметь возможность запускать функцию на входе для каждого из локалей.