Преобразование символов UTF-8 в верхний / нижний регистр C ++ - PullRequest
5 голосов
/ 09 сентября 2010

У меня есть строка, содержащая символы UTF-8, и у меня есть метод, который должен конвертировать каждый символ в верхний или нижний регистр, это легко сделать с помощью символов, которые перекрываются с ASCII, и, очевидно, некоторые символы преобразованный, например любой китайский иероглиф. Однако есть хороший способ обнаружить и преобразовать другие символы, которые могут быть верхним / нижним, например, все греческие персонажи? Также обратите внимание, что мне нужно иметь возможность делать это как в Windows, так и в Linux.

Спасибо,

Ответы [ 3 ]

16 голосов
/ 09 сентября 2010

Посмотрите на ICU .

Обратите внимание, что функции от нижнего регистра к верхнему регистру зависят от локали. Подумайте о турецкой (ascii) букве I, которая получает «строчную букву i без точек» и (ascii) i, которая получает «прописную букву I с точкой».

2 голосов
/ 09 сентября 2010

Предполагая, что у вас есть доступ к wctype.h, затем преобразуйте ваш текст в 2-байтовую строку юникода и используйте towupper ().Затем преобразовать его обратно в UTF-8.

0 голосов
/ 10 июля 2018

В Linux или со стандартной библиотекой, которая его поддерживает, вы получите объект std::locale для соответствующей локали, поскольку преобразование в верхнем регистре зависит от локали. Преобразуйте каждый символ UTF-8 в wchar_t, затем вызовите std::toupper() для него, а затем преобразуйте обратно в UTF-8. Обратите внимание, что результирующая строка может быть длиннее или короче, и некоторые лигатуры могут не работать должным образом: ß к Ss на немецком языке - это пример, который все продолжают приводить.

В Windows этот подход будет работать даже меньше времени, потому что широкие символы - это UTF-16, а не кодировка фиксированной ширины (что нарушает стандарт языка C ++, но, возможно, комитет по стандартам не должен был пытаться блефует Microsoft на взлом Windows API). В CLR есть метод ToUpper.

Вероятно, проще использовать переносную библиотеку, такую ​​как ICU.

Также убедитесь, что вы хотите использовать заглавные буквы (заглавные буквы) или заглавные буквы (заглавные буквы первой строки или первую часть лигатуры).

...