crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Перевод строки в транслит
++Norton++
  опции профиля:
сообщение 4.11.2009, 23:50
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 98
Регистрация: 5.10.2008
Пользователь №: 380

Спасибо сказали: 0 раз(а)




Репутация:   1  


Стоит задача перевести строку QString в транслит (т.е. к примеру, русскую строку "привет мир" в "privet mir").
Хотелось бы узнать мнение, как лучше это сделать? Просто текст может быть очень большим.
Переводить все просто условиями, т.е. к примеру
if(str.at(i) == 'в')  resultStr.append("v");
else if(str.at(i) == 'г')  resultStr.append("g");
else if .....
...

Или может есть какой-то более рациональный вариант?

PS
И хотелось бы тут же спросить, как правильно сравнивать символы в вышеприведенном случае? Сравнение как в примере выше не получается. Т.е. если есть слово "арбуз", то в данном случае в if буква 'а' вовсе не распознается как 'а'. Да и все остальные буквы также. В чем может быть дело?

Сообщение отредактировал ++Norton++ - 5.11.2009, 0:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.11.2009, 3:50
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(++Norton++ @ 5.11.2009, 2:50) *
то в данном случае в if буква 'а' вовсе не распознается как 'а'.
какая из них русская, а какая английская?


Цитата(++Norton++ @ 5.11.2009, 2:50) *
Или может есть какой-то более рациональный вариант?
яб словарь использовал (QMap) или Хэш (QHash), последний быстрее работает

П.С. в коде:
Цитата(++Norton++ @ 5.11.2009, 2:50) *
if(str.at(i) == 'в') resultStr.append("v");
лучше строковые не ASCII константы обернуть в некую функцию, например, QObject::tr() и указать библиотеке Qt кодировку исходника
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
++Norton++
  опции профиля:
сообщение 5.11.2009, 10:57
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 98
Регистрация: 5.10.2008
Пользователь №: 380

Спасибо сказали: 0 раз(а)




Репутация:   1  


Огромнейшее спасибо! QHash замечательно с этой задачей справляется! И шустро и без глюков!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wander86
  опции профиля:
сообщение 5.11.2009, 16:15
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 8.6.2009
Из: Днепропетровск
Пользователь №: 812

Спасибо сказали: 1 раз(а)




Репутация:   0  


Привет. Тут регекспами нада пользоваться, а точнее "покурите" replace.
Принцип транслитерации:
- Делаете ассоциативный массив, где ключем будет латинская буква, значением - кирилица.
- Делаете тот же foreach цикл, и в нем уже заменяете replace'ом все символы кирилицы на латиницу.


.....Не туда вроде написал (-:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.11.2009, 17:25
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


wander86, регулярные выражения здесь ни к чему.
Цитата(wander86 @ 5.11.2009, 19:15) *
где ключем будет латинская буква, значением - кирилица.
наоборот, известна кирилица, её в Хэше и ищем (быстро)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 6.11.2009, 12:27
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Litkevich Yuriy,
если уж делать транслит, то можно сделать и обратный таранслит.
я тоже подумал про ассоциативные массивы. буковок не так много что б прям QHash использование было оправдано...
ну тут дело вкуса.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Awesome
  опции профиля:
сообщение 29.1.2011, 0:08
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 26.1.2011
Пользователь №: 2370

Спасибо сказали: 0 раз(а)




Репутация:   0  


Пишу функцию перевода строки в транслит, столкнулся с той же проблемой.
Если переводимую строку на русском указать в самой программе, то строка переводится. Но я загружаю её из файла, и ничего не работает, поэтому думаю, что проблема с кодировками.
В связи с этим хотелось бы узнать поподробнее про это:
Цитата(Litkevich Yuriy @ 5.11.2009, 3:50) *
лучше строковые не ASCII константы обернуть в некую функцию, например, QObject::tr() и указать библиотеке Qt кодировку исходника

потому что я ничего не понял).
Вот мой код, если что:
Раскрывающийся текст
void MainWindow::on_pushButton_2_clicked()
{
    QString str = ui->lineEditTest->text();
    //QString str = "строка на русском"; //если убрать этот коммент, то функция нормально переведет эту строку
    QString result = "";
    QHash<QChar,QString> trHash;
    trHash.insert('а',"a");    trHash.insert('б',"b");
    trHash.insert('в',"v");    trHash.insert('г',"g");
    trHash.insert('д',"d");    trHash.insert('е',"ye");
    trHash.insert('ё',"yo");    trHash.insert('ж',"zh");
    trHash.insert('з',"z");    trHash.insert('и',"i");
    trHash.insert('й',"y");    trHash.insert('к',"k");
    trHash.insert('л',"l");    trHash.insert('м',"m");
    trHash.insert('н',"n");    trHash.insert('о',"o");
    trHash.insert('п',"p");    trHash.insert('р',"r");
    trHash.insert('с',"s");    trHash.insert('т',"t");
    trHash.insert('у',"u");    trHash.insert('ф',"f");
    trHash.insert('х',"kh");    trHash.insert('ц',"c");
    trHash.insert('ч',"ch");    trHash.insert('ш',"sh");
    trHash.insert('щ',"sch");    trHash.insert('ъ',"");
    trHash.insert('ы',"y");    trHash.insert('ь',"");
    trHash.insert('э',"e");    trHash.insert('ю',"yu");
    trHash.insert('я',"ya");
    str = str.toLower();
    for(int i=0;i<str.size();i++) {
        qDebug() << str.at(i);
        if(trHash.contains(str.at(i)) == true) {
            result.append(trHash.value(str.at(i)));
        }
        else result.append(str.at(i));
    }
    ui->lineEditTest->setText(result);
}


P.S. извините, что апаю старую тему (не знаю, ругаете вы это или нет)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 4.8.2020, 5:05