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