Преобразование широкой строки символов в строчные в C ++

StackOverflow https://stackoverflow.com/questions/1614595

  •  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 ).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top