Russian Qt Forum
Сентябрь 21, 2024, 14:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Транслитерация [РЕШЕНО]  (Прочитано 9245 раз)
24pm
Гость
« : Апрель 07, 2009, 17:08 »

Пишу функцию для создания корректных веб имён, в которой использую транслитерацию русских букв:

Код:
QString CreateValidWebFileName(QString str)
{
QString fn;
int i;
QString validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_,.()[]{}<>~!@#$%^&*+=?";
QString rusUpper = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ";
QString rusLower = "абвгдеёжзийклмнопрстуфхцчшщыэюя";
QStringList lat;
lat <<"a"<<"b"<<"v"<<"g"<<"d"<<"e"<<"jo"<<"zh"<<"z"<<"i"<<"j"<<"k"<<"l"<<"m"<<"n"
<<"o"<<"p"<<"r"<<"s"<<"t"<<"u"<<"f"<<"h"<<"c"<<"ch"<<"sh"<<"sh"<<"ie"<<"ju"<<"ja";
qDebug() << "rus=" << rusUpper;
for (i=0; i < str.size(); ++i){
qDebug() << "char="<< str[i]<<", fn="<<fn;
if ( validChars.contains(str[i]) ){
fn = fn + str[i];
}else if (str[i] == ' '){  //replace spaces
fn = fn + "_";
}else if ( rusUpper.contains(str[i]) || rusLower.contains(str[i]) ) {//transliterate
fn = fn + lat[i];
}
}
if (fn.isEmpty() ) fn = "file";
return fn;
}
но транслитерация не работает. Qt хранит все строки в UTF-8 так, что не понятно чего ему не хватает?
qDebug() в Creator выдаёт мусор:
Код:
rus= "???????????????????˜??????????????? ???????¤???¦?§???©?«?­?®??" 
char= 'ï' , fn= ""
char= 'ó' , fn= ""
char= 'í' , fn= ""
char= 'ê' , fn= ""
char= 'ò' , fn= ""
Может уже кто реализовывал это?
« Последнее редактирование: Апрель 09, 2009, 00:09 от 24pm » Записан
spirit
Гость
« Ответ #1 : Апрель 07, 2009, 17:14 »

делал такую байдень только для украинского языка.
Код
C++ (Qt)
QString Utils::createLatinName(const QString &name)
{
QString res;
static QMap<QString, QString> toTranslit;
toTranslit["а"] = 'a';
toTranslit["б"] = 'b';
toTranslit["в"] = 'v';
toTranslit["г"] = 'g';
toTranslit["д"] = 'd';
toTranslit["е"] = 'e';
toTranslit["ё"] = "jo";
toTranslit["ж"] = "zh";
toTranslit["з"] = 'z';
toTranslit["и"] = 'i';
toTranslit["й"] = 'j';
toTranslit["к"] = 'k';
toTranslit["л"] = 'l';
toTranslit["м"] = 'm';
toTranslit["н"] = 'n';
toTranslit["о"] = 'o';
toTranslit["п"] = 'p';
toTranslit["р"] = 'r';
toTranslit["с"] = 's';
toTranslit["т"] = 't';
toTranslit["у"] = 'u';
toTranslit["ф"] = 'f';
toTranslit["х"] = 'h';
toTranslit["ц"] = 'c';
toTranslit["ч"] = "ch";
toTranslit["ш"] = "sh";
toTranslit["щ"] = 'w';
toTranslit["ъ"] = '#';
toTranslit["ы"] = 'y';
toTranslit["ь"] = '\'';
toTranslit["э"] = "e";
toTranslit["ю"] = "ju";
toTranslit["я"] = "ja";
toTranslit["є"] = "je";
toTranslit["і"] = 'i';
toTranslit["ї"] = "i'";
 
for (int i = 0; i < name.length(); ++i) {
const QString ch = name.at(i);
const QString lowerCh = ch.toLower();
if (toTranslit.contains(lowerCh)) {
QString tmp = ch == lowerCh ? toTranslit[lowerCh] : toTranslit[lowerCh].toUpper();
res += tmp;
} else
res += ch;
}
 
return res;
}
 
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Апрель 07, 2009, 17:15 »

Нужно использовать QTextCodec или tr. В поиск по форуму, тема уже затерта до дыр.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Апрель 07, 2009, 20:40 »

>>Qt хранит все строки в UTF-8 ...
Qt хранит строки в нутри себя в UTF-16
Записан

Юра.
24pm
Гость
« Ответ #4 : Апрель 09, 2009, 00:06 »

Функция готова. Так как она не является потомком QObject, то вместо tr() использую translate():
Код:
QString CreateValidWebFileName(QString str)
{
QString fn;
int i, rU, rL;
QString validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_,.()[]{}<>~!@#$%^&*+=?";
QString rusUpper = QApplication::translate("pCommon","АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ", 0, QApplication::UnicodeUTF8);
QString rusLower = QApplication::translate("pCommon","абвгдеёжзийклмнопрстуфхцчшщыэюя", 0, QApplication::UnicodeUTF8);
QStringList latUpper, latLower;
latUpper <<"A"<<"B"<<"V"<<"G"<<"D"<<"E"<<"Jo"<<"Zh"<<"Z"<<"I"<<"J"<<"K"<<"L"<<"M"<<"N"
<<"O"<<"P"<<"R"<<"S"<<"T"<<"U"<<"F"<<"H"<<"C"<<"Ch"<<"Sh"<<"Sh"<<"I"<<"E"<<"Ju"<<"Ja";
latLower <<"a"<<"b"<<"v"<<"g"<<"d"<<"e"<<"jo"<<"zh"<<"z"<<"i"<<"j"<<"k"<<"l"<<"m"<<"n"
<<"o"<<"p"<<"r"<<"s"<<"t"<<"u"<<"f"<<"h"<<"c"<<"ch"<<"sh"<<"sh"<<"i"<<"e"<<"ju"<<"ja";
for (i=0; i < str.size(); ++i){
if ( validChars.contains(str[i]) ){
fn = fn + str[i];
}else if (str[i] == ' '){  //replace spaces
fn = fn + "_";
}else{
rU = rusUpper.indexOf(str[i]);
rL = rusLower.indexOf(str[i]);
if (rU > 0)         fn = fn + latUpper[rU];
else if (rL > 0)   fn = fn + latLower[rL];
}
}
if (fn.isEmpty() ) fn = "file";
return fn;
}
Спасибо всем кто откликнулся!
« Последнее редактирование: Апрель 10, 2009, 00:53 от 24pm » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Апрель 09, 2009, 13:37 »

Так как она не является потомком QObject, то вместо tr() использую translate():

Можно было использовать и tr(), она статическая:

QObject::tr("something");
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
24pm
Гость
« Ответ #6 : Апрель 10, 2009, 02:24 »

Действительно! Заменил две длинные строки на 3 короткие - смотрится изящней:
Код:
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QString rusUpper = QObject::tr("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ");
QString rusLower = QObject::tr("абвгдеёжзийклмнопрстуфхцчшщыэюя");

Спасибо! Улыбающийся
Записан
Alex03
Гость
« Ответ #7 : Апрель 10, 2009, 10:34 »

В данном случае ни tr() ни translate() не нужны.
Достаточно
Код:
QString rusUpper = QString::fromUtf8("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ");
QString rusLower = QString::fromUtf8("абвгдеёжзийклмнопрстуфхцчшщыэюя");

Конечно при условии что у Вас исходник в UTF-8.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.085 секунд. Запросов: 22.