Преобразование широкой строки символов в строчные в C ++
-
06-07-2019 - |
Вопрос
Как мне преобразовать строку wchar_t из верхнего регистра в строчный в C ++? Р>
Строка содержит смесь японских, китайских, немецких и греческих символов.
Я думал об использовании буксировщика ...
http://msdn.microsoft.com/ ан-нас / библиотека / 8h19t214% 28VS.80% 29.aspx
.. но в документации сказано, что:
Преобразование в буксировщик зависит от региона. В этом случае изменяются только символы, относящиеся к текущей локали.
Изменить: Может быть, я должен описать, что я делаю. Я получаю поисковый запрос Unicode от пользователя. Первоначально он в кодировке UTF-8, но я конвертирую его в широкоформатный код (возможно, я ошибаюсь в формулировке). Мой отладчик (VS2008) правильно отображает символы японского, немецкого и т. Д. В переменной & Quot; переменная быстрого просмотра & Quot ;. Мне нужно пройти через другой набор данных в Юникоде и найти совпадения строки поиска. Хотя это не проблема для меня, когда поиск чувствителен к регистру, более проблематично делать это без учета регистра. Мой (возможно, наивный) подход к решению проблемы состоял бы в том, чтобы преобразовать все входные и выходные данные в нижний регистр, а затем сравнить их.
Решение
Если ваша строка содержит все эти символы, кодовый набор должен быть основан на Unicode. При правильной реализации Unicode (глава 4 ' Свойства символа ') определяет свойства символа, в том числе отображение символа в верхнем и нижнем регистре и т. д. р>
Учитывая эту преамбулу, функция towlower()
из <wctype.h>
является правильным инструментом для использования. Если он не справляется с работой, у вас есть проблема с QoI (качеством реализации), которую вы можете обсудить с вашим поставщиком. Если вы обнаружите, что поставщик не отвечает, посмотрите на альтернативные библиотеки. В этом случае вы можете подумать о ICU (международные компоненты для Unicode).
Другие советы
У вас неприятная проблема. Японский язык не поможет конвертировать немецкий и наоборот. Существуют языки, в которых также нет понятия каптализации (toupper
, и я думаю, друзья здесь не будут). Итак, вы можете разбить свою строку на отдельные куски слов из того же языка? Если вы можете, то можете преобразовать кусочки и натянуть их.
Этот ответ SO показывает, как работать с фасетами для работы с несколькими локалями. Если это в Windows, вы можете рассмотреть возможность использования функций Win32 API, если вы можете работать с C ++. NET (управляемый C ++), вы можете использовать функции char.ToLower
и string.ToLower
, которые совместимы с Юникодом.
Просмотрите _wcslwr_l
в <wchar.h>
( MSDN ).
Вы должны иметь возможность запускать функцию на входе для каждой из локалей.