Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: ramin от Ноябрь 20, 2009, 12:03



Название: QTextEdit- Unicode
Отправлено: ramin от Ноябрь 20, 2009, 12:03
допустим я создал 2 объекта QTextEdit и я написал слово английскими буквами как мне сделать чтобы в во втором обьекте это же слово было русскими буквами?


Andrey-Андрей


Название: Re: QTextEdit- Unicode
Отправлено: Alchazar от Ноябрь 20, 2009, 13:17
читаем введёный текст по буквам и заменяем буквы
Код:
QString text1, text2;
text1 = labelEdit->text();

for (int i=0; i < labelEdit->text().lenght; i++)
{
    switch (text1[i])
    {
         case 'a':
             text2[i] = 'a';
             break;
         case 'b':
             text2[i] = 'б';
             break;
        .....
        .....
    }
}

labelEdit2->setText(text2);

вроде так это можно сделать


Название: Re: QTextEdit- Unicode
Отправлено: zenden от Ноябрь 20, 2009, 17:42
Цитировать
вроде так это можно сделать
Не знал, что этот форум посещают индусы  ;D

давно такого ужасного кода не видел, при том еще и неработающего)


Название: Re: QTextEdit- Unicode
Отправлено: Alchazar от Ноябрь 20, 2009, 18:03
Тогда что тебе мешает показать свой вариат решения, научить идусов как надо програмить?


Название: Re: QTextEdit- Unicode
Отправлено: Igors от Ноябрь 20, 2009, 18:22
давно такого ужасного кода не видел, при том еще и неработающего)
Да, это примитивно, но я в упор не вижу почему это плохо :) И можно сделать примитивно за 15 минут, а "эстет" будет изучать тонкости кодировки неделю - а то и больше  :)


Название: Re: QTextEdit- Unicode
Отправлено: zenden от Ноябрь 20, 2009, 18:46
Да, это примитивно, но я в упор не вижу почему это плохо :) И можно сделать примитивно за 15 минут, а "эстет" будет изучать тонкости кодировки неделю - а то и больше  :)

1) text2[ i ]=... вызовет ошибку, т.к. память не выделена.
2) labelEdit->text().lenght - ошибка в названии + нет вызова функции
3) конструкция switch (text1[ i ]) не скомпилируется, т.к. text[ i ] - не числовое значение

Код
C++ (Qt)
QString unTranslit(const QString &str)
{
QString result = str;
 
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
 
QString rule = "a=а;b=б;v=в;g=г;d=д;e=е;yo=ё;zh=ж;j=ж;z=з;i=и;y=й;k=к;ck=к;l=л;m=м;n=н;o=о;p=п;"
"r=р;s=с;t=т;u=у;f=ф;h=х;c=ц;ch=ч;sh=ш;sch=щ;''=ъ;yi=ы;'=ь;ye=э;ju=ю;yu=ю;ja=я;"
"ya=я;A=А;B=Б;V=В;G=Г;D=Д;E=Е;Yo=Ё;Zh=Ж;J=Ж;Z=З;I=И;Y=Й;K=К;L=Л;M=М;N=Н;O=О;"
"P=П;R=Р;S=С;T=Т;U=У;F=Ф;H=Х;C=Ц;Ch=Ч;Sh=Ш;Sch=Щ;Yi=Ы;Ye=Э;Yu=Ю;Ju=Ю;Ya=Я;Ja=Я";
QStringList ruleList = rule.split(";");
QStringListIterator it(ruleList);
 
while (it.hasNext())
{
QString s = it.next();
result.replace(s.section('=',0,0), s.section('=',1,1));
}
return result;
}
 
...
 
ui->textEdit2->setText(unTranslit(ui->textEdit->toPlainText()));

Правда rule надо отредактировать, чтобы сначало шли многобуквенные комбинации, а потом одиночные буквы, но не важно.


Название: Re: QTextEdit- Unicode
Отправлено: ramin от Ноябрь 21, 2009, 12:12
а как вам если сделать через QMap
QMap<QString,QString>mapSymbol;
mapSymbol["a"]="a";
...........
mapSymbol["n"]="н";


Название: Re: QTextEdit- Unicode
Отправлено: Igors от Ноябрь 21, 2009, 14:05
Код:
	QStringListIterator it(ruleList);

while (it.hasNext())
{
QString s = it.next();
result.replace(s.section('=',0,0), s.section('=',1,1));
}
return result;
}
Никто не обещал что короткие комбинации не являются началом более длинных, поэтому смелое replace (по всей строке) работать не будет. С точки зрения скорости - безжалостная эксплуатация ресурсов. Ну и если уж придираться к синтаксису - то не мешало бы объявить static const rule  :)
Я бы писал скромнее и проще, например

Код:
enum {
  translate_Forward = 0,
  translate_Backward = 1
};

int LookupDictionary( const QString & src, const QStringList & lst, int direction )
{
   for (int i = 0; i < lst.size(); i += 2)
     if (src.startsWith(lst[i + direction])) return i;
   return -1;
}

QString unTranslit(const QString & theStr, int translateDir)
{
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
 
static const QString rule = {"..."};  // dictionary
static QStringList ruleList;

        if (!ruleList.size()) {
QStringList temp = rule.split(";");
         for (int i = 0; i < temp.size(); ++i) {
           ruleList.append(temp[i].section('=', 0, 0).trimmed());
           ruleList.append(temp[i].section('=', 0, 1).trimmed());
         }
       }

       QString dst, temp, src = theStr;
       while (src.size()) {
           int index = LookupDictionary(src, ruleList, translateDir);
           temp = (index < 0) ? src[0] : ruleList[index + (translateDir ? -1 : 1)];

           // handle upper-lower case here

           dst += temp;
           int numDel = (index < 0) ? 1 : ruleList[index + (translateDir ? 1 : 0)].size();
           src.remove(0, numDel);
       }
       return dst;
}