Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод кирилицы в нижний регистр C++, без STL библиотек 
:(
    Опции темы
TupDub
Дата 1.2.2010, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 21.11.2009

Репутация: нет
Всего: нет



Привет! 

Пытаюсь сделать преобразование строки на русском родном языке в нижний регистр, без помощи STL библиотеки - 
ничего не помогает. 

Вот код:
Код


char *str = "Рыба";
    if(((unsigned char)str[1] >= 144) && ((unsigned char)str[1] <= 175))
    {
        printf("ZAGL %s \n", str);
        str[1] = (char)((unsigned char)str[1] - 32 - 256);
    }
    printf("Cyr %s \n", str);

но почему-то не получается... в лучше случае он выводит вместо заглвной буквы Р букву Ё! 
Ёлки - палки... Люди, сижу с этим весь день... как это делать правильно ? 
Пытался также воспользоваться стандартными функциями типа tolower но они работаю только для латинского алфавита, а для кирилицы не работают! Установка локали не помогла... 


PM   Вверх
Alca
Дата 1.2.2010, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



CharLower

Добавлено через 25 секунд
Если винда


--------------------
PM WWW ICQ Skype Jabber   Вверх
TupDub
Дата 1.2.2010, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 21.11.2009

Репутация: нет
Всего: нет



у меня не винда, убунта... чистый Си... без посторонних библиотек
PM   Вверх
zim22
Дата 1.2.2010, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(TupDub @  1.2.2010,  15:56 Найти цитируемый пост)
преобразование строки на русском родном языке в нижний регистр,

tolower
Цитата(TupDub @  1.2.2010,  15:56 Найти цитируемый пост)
функциями типа tolower но они работаю только для латинского алфавита, а для кирилицы не работают

работают они для кириллицы
тыц

Это сообщение отредактировал(а) zim22 - 1.2.2010, 18:08


--------------------
PM MAIL   Вверх
bsa
Дата 1.2.2010, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



TupDub, думаю, тебе нужно использовать towlower() совместно с setlocale().
PM   Вверх
Alca
Дата 1.2.2010, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Цитата

Установка локали не помогла... 

Покажи как ты пытался


--------------------
PM WWW ICQ Skype Jabber   Вверх
TupDub
Дата 2.2.2010, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 21.11.2009

Репутация: нет
Всего: нет



bsa, да ... я пытаюсь!
я пробую так:
Код

setlocale(LC_ALL,"ru_RU.UTF-8");
    char *str = "Рыба";
    tolower(str[1]);
    printf(" %s \n", str);

но так не переводит ничего... не работает. Как правильно установить локаль?
Вот так делаю, показывает правильно локаль:
Код

    printf ("Locale is: %s\n", setlocale(LC_ALL,NULL) );


Это сообщение отредактировал(а) TupDub - 2.2.2010, 13:56
PM   Вверх
Alca
Дата 2.2.2010, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



а так?
Код

setlocale(LC_ALL,NULL);


Добавлено через 3 минуты и 32 секунды
http://www.cplusplus.com/reference/clibrar...cale/setlocale/
Цитата

The function can also be used to retrieve the current locale's name by passing NULL as the value for locale.


Это сообщение отредактировал(а) Alca - 2.2.2010, 13:50


--------------------
PM WWW ICQ Skype Jabber   Вверх
TupDub
Дата 2.2.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 21.11.2009

Репутация: нет
Всего: нет



Alca, Вот так делаю, показывает правильно локаль:код C++
    printf ("Locale is: %s\n", setlocale(LC_ALL,NULL) );

PM   Вверх
artsb
Дата 2.2.2010, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



Цитата(TupDub @  2.2.2010,  13:37 Найти цитируемый пост)
я пробую так:

Может как писал bsa:
Код

towlower(str[1]);



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
bsa
Дата 2.2.2010, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



TupDub, ты разницу между tolower() и towlower() заметить можешь?
А пытаться использовать tolower() для кириллицы сущий бред, так как кириллические символы в UTF-8 двухбайтные, а tolower() работает только с символами, значения которых находятся в пределах char + EOF!
PM   Вверх
xvr
Дата 2.2.2010, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Код

setlocale(LC_ALL,"ru_RU.UTF-8");
Сдается мне, что не UTF8 у тебя кодировка исходника. 
Далее, вот это неправильно
Код

    char *str = "Рыба";
    tolower(str[1]);
должно быть так
Код

    char str[] = "Рыба";
    str[0]=tolower(str[0]);


PM MAIL   Вверх
Alca
Дата 2.2.2010, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Код

    setlocale(LC_ALL, "");
    char str[] = "Рыба";
    str[0]=tolower(str[0]);

у меня работает


--------------------
PM WWW ICQ Skype Jabber   Вверх
artsb
Дата 2.2.2010, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



У меня вот так работает:
Код

setlocale(LC_ALL,"Russian");     // ru_RU.UTF-8
wchar_t *str = L"Рыбка";
std::wcout << str << std::endl;
str[0] = towlower(str[0]);
std::wcout << str;



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
bsa
Дата 2.2.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Alca @  2.2.2010,  14:17 Найти цитируемый пост)
у меня работает 
У тебя Windows, в котором по умолчанию CP1251. Выстави в настройках Языка (панель управления) текущий язык Английский. И посмотри что будет с твоей программой.

PM   Вверх
Alca
Дата 2.2.2010, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



bsa, ok

Добавлено через 3 минуты и 43 секунды
А если текущий язык украинский?

Добавлено через 4 минуты и 8 секунд
Для каждого языка свою локаль задавать?


--------------------
PM WWW ICQ Skype Jabber   Вверх
bsa
Дата 2.2.2010, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Если используешь wchar_t, то проблемы могут возникнуть только с редкими языками и, возможно, китайский с японским. Т.е. с теми, чьи символы не помещаются в 16 разрядов (в windows sizeof(wchar_t) == 2).

Добавлено через 58 секунд
http://forum.vingrad.ru/index.php?showtopi...t&p=2086699
PM   Вверх
TupDub
Дата 2.2.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 21.11.2009

Репутация: нет
Всего: нет



bsa, 
Код

TupDub, ты разницу между tolower() и towlower() заметить можешь?

могу конечно... smile )) Напишу ещё раз: я не под студией, у меня просто нет такой функции towlower

У меня по-прежнему не работает этот кусок... 
 
Код

setlocale(LC_ALL, "");
 char str[] = "Рыба";
 str[0]=tolower(str[0]);
 printf(" %s \n", str);

Народ, я пытаюсь сделать так ещё... 
Код

str[0] = (unsigned char)str[0] - 256 -32;

Но вместо буквы р получаю букву Ё. подозреваю, что там с битами что-то надо сделать... но как ??? 

PM   Вверх
bsa
Дата 2.2.2010, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



TupDub, тогда мои тебе сочувствия. Меняй стандартную библиотеку С на ту, что поддерживает C99. И не парь мозг себе попытками сделать код рабочим, так как кириллица имеет размер 2 байта в UTF-8! Сделай прикола ради printf("%d\n", sizeof(str));
PM   Вверх
artsb
Дата 2.2.2010, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



Код

char bufRussian[500];

char* ToRussian(const char* text) {
 CharToOem(text, bufRussian);
 return bufRussian;
}

int main(int argc, char* argv[])
{
    setlocale(LC_ALL,"Russian");
    char str[] = "Рыбка";
    std::cout << ToRussian(str) << std::endl;
    str[0]=tolower(str[0]);
    std::cout << ToRussian(str);
    getch();
    return 0;
}



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
bsa
Дата 2.2.2010, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



artsb, это что было? Ты надеюсь понимаешь, что у ТС не Windows? Потому что под Windows и так есть towlower().
PM   Вверх
artsb
Дата 2.2.2010, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



Цитата(bsa @  2.2.2010,  15:43 Найти цитируемый пост)
что у ТС не Windows

Что-то не заметил где это написано  smile

Добавлено @ 15:48
А что у него?

Добавлено @ 15:49
Для Unix вроде как используется так:
Код

setlocale(LC_ALL,"ru_RU");


Добавлено @ 15:51
Цитата(artsb @  2.2.2010,  15:48 Найти цитируемый пост)
А что у него?

Уже нашёл smile

Добавлено @ 15:55
Цитата(bsa @  2.2.2010,  15:43 Найти цитируемый пост)
Потому что под Windows и так есть towlower(). 

А у меня и с tolower работает (код выше на этой странице).

Добавлено @ 15:59
А вот CharToOem скорее всего у него нет.

Это сообщение отредактировал(а) artsb - 2.2.2010, 16:00


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
bsa
Дата 2.2.2010, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(artsb @  2.2.2010,  15:48 Найти цитируемый пост)
А у меня и с tolower работает (код выше на этой странице).
Работает потому что у тебя кодировка однобайтная. Была бы UTF-8, как у ТС, то не работало бы.

PM   Вверх
artsb
Дата 2.2.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



Цитата(bsa @  2.2.2010,  16:02 Найти цитируемый пост)
Работает потому что у тебя кодировка однобайтная. Была бы UTF-8, как у ТС, то не работало бы.

Ясно. Спс.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
TupDub
Дата 2.2.2010, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 21.11.2009

Репутация: нет
Всего: нет



Спасибо народ за сочувтвие ... буду биться дальше  smile 

PM   Вверх
artsb
Дата 2.2.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



TupDub, а почему вы не хотите юзать STL? tolower


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
bsa
Дата 2.2.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



TupDub, интересно, а почему у тебя нет towlower? в убунте он есть.
100% рабочий под Ubuntu 9.10 код:
Код
#include <locale.h>
#include <wctype.h>
#include <stdio.h>
#include <wchar.h>

int main()
{
        setlocale(LC_ALL, "");
        wchar_t str[] = L"Рыба";
        str[0] = towlower(str[0]);
        printf("%S\n", str);
        return 0;
}

PM   Вверх
zim22
Дата 2.2.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(artsb @  2.2.2010,  15:41 Найти цитируемый пост)
а почему вы не хотите юзать STL?

а смысл от STL? всё-равно фунция tolower вызывается.


--------------------
PM MAIL   Вверх
artsb
Дата 2.2.2010, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



Цитата(zim22 @  2.2.2010,  16:45 Найти цитируемый пост)
а смысл от STL? всё-равно фунция tolower вызывается. 

А я уже понял. ТС юзает чистый С...

Добавлено через 2 минуты и 55 секунд
Цитата(bsa @  2.2.2010,  16:45 Найти цитируемый пост)
в убунте он есть.

Ага. towlower


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.