![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
ISP |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 14.5.2008 Где: Санкт-Петербург Репутация: нет Всего: нет |
Интересует как поменять нижний регистр на верхний в utf-8 ? Если как то важно то используется linux g++
![]() |
|||
|
||||
ISP |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 14.5.2008 Где: Санкт-Петербург Репутация: нет Всего: нет |
например вот такой код
#include <iostream> #include <cctype> #include <locale.h> #include <string> using namespace std; int main() { setlocale(LC_CTYPE,"ru_RU.UTF-8"); string s; getline(cin, s); for (int i = 0; i < (int)s.length(); ++i) { s[i] = toupper(s[i]); } cout << s << endl; return 0; } если латиница то нормально меняет ,но только вводишь русские , то оставляет как есть, в чем причина? |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Нужно преобразовать из uff8 в utf16 (wchar_t*)
изменить регистр, и преобразовать назад. Как это сделать в Qt знаю, как используя только системные функции Linux - не знаю. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вы как-то агрессивно-негативно настроены. не нужно выливать "это" на участников. я лишь хотел сказать, что конверт в utf-16 ничего не даст, т.к. работа с локалями в utf-16 ничем не отличается, и поэтому ваше предложение лишено смысла. в гугле про работу с локалями, написано наверное чуть меньше чем про использование стандартного вывода. и все подобные "писюльки" начинаются с выполнения "locale -a". |
|||
|
||||
ISP |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 14.5.2008 Где: Санкт-Петербург Репутация: нет Всего: нет |
с локалью то все хорошо, только вот информации как Вы говорите не много , проверял локали
cout << "std::locale loc=" << loc.name() << endl; printf(setlocale(LC_ALL, "")); все правилно ,utf-8 ,но только начинаешь использовать toupper и как будто ничего не изменилось с русскими буквами, а с латиницей все норм))) решали вопрос тут http://www.linux.org.ru/forum/development/2904684 ,но и то как то не удачно :( подключать boost ?!?! хм.... желательно бы стандартными средствами это сделать))) ![]() |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
сначала с помощью mbstowcs преобразуешь utf-8 в wchar_t, с помощью wcsupr приводишь к верхнему регистру, и наконец с помощью wcstombs преобразуешь результат в utf-8
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
sizeof("абв") == 7
а чё, facepalm так и не добавили? |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Так бы сразу бы и поясняли - всё было бы ясно, a "зачем?" можно понять по-разному, т. е. что есть способ решить проблему без преобразования в utf-16 и Вы его знаете, но почему-то скрываете. towupper(wchar_t) действительно работает только для латиницы. QString::toUpper() работает правильно и для кириллицы - т.е. при использовании Qt преобразование в utf-16 помогает решить задачу. Но я посмотрел в исходники Qt, там для этого используются свои таблицы типов символов Unicode - видимо, стандартного кроссплатформенного решения не существует. |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
boostcoder, touché ? Добавлено через 30 секунд ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Вот, это и есть, о чем я говорил Это все она, божественная кодировка ![]() |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
UTF-8 кодировка многобайтовая. В ней один символ может занимать от 1 до 5 байтов (если правильно помню). Так что toupper нужно применять ко всем этим 5 байтам сразу, а стандартный toupper такого авангардизма не понимает ![]() Так что wchar_t будет ответом - там символ всегда один (хоть и 16 или 32х битный) ![]() |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
xvr, для этого есть std::toupper
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |