C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
AnsiString и румынские буквы, или как их туда запихнуть?
Владимир
Отправлено: 18.12.2006, 11:08


Ученик-кочегар

Группа: Участник
Сообщений: 6



Здравствуйте.
Имеется файлик определенного формата с наименованиями товаров, а в нем некоторые буквы из румынского алфавита. Имеется соответсвие кодов и букв. Если такая буква встречается, то хочется вывести именно румынскую букву в ComboBox и StringGrid. А как?

Код такой:
CODE

       // Item[MaxItem].item — массив char-ов
       AnsiString tmp = "";
       // Здесь считывается hex последовательность 20 00 44 41 4C 45 4D 52 41 4D
       for( int j = 9; j >= 0; j-- )
       {
           FileRead( file, &(Item[MaxItem].item[j]), 1 );
       }
       tmp.printf( "%10s", Item[MaxItem].item );
       for( int j = 1; j <= 10; j++ )
       {
           if( tmp[j] == 0 ) tmp[j] = 'A';  // А с уголком вниз
           if( tmp[j] == 1 ) tmp[j] = 'I';  // I c уголком вверх
           if( tmp[j] == 2 ) tmp[j] = 'T';  // Т и внизу запятая
           if( tmp[j] == 3 ) tmp[j] = 'A';  // А с уголком вниз
           if( tmp[j] == 4 ) tmp[j] = 'S';  // S и внизу запятая
       }
       ComboBox->Items->Add(tmp);


Отредактировано Владимир — 18.12.2006, 11:21
AVC
Отправлено: 18.12.2006, 11:20


Ветеран

Группа: Модератор
Сообщений: 1583



При использовании AnsiString так не получится. Либо все англорусское, либо англорумынское а частично — никак.
Надо использовать компоненты поддерживающие уникод. Либо можно поробовать перехватывать низкоуровневый вывод (румынскими они становятся только при прорисовке).
Владимир
Отправлено: 18.12.2006, 11:23


Ученик-кочегар

Группа: Участник
Сообщений: 6



А мне русские буквы и не нужны, нужны только англорумынские.
Владимир
Отправлено: 18.12.2006, 11:31


Ученик-кочегар

Группа: Участник
Сообщений: 6



QUOTE (AVC @ 18.12.2006, 11:20)
При использовании AnsiString так не получится. Либо все англорусское, либо англорумынское а частично — никак.
Надо использовать компоненты поддерживающие уникод.

Если не AnsiString, то что можно использовать ?
И какие компоненты из стандартного набора Builder 6 используют Unicode ?
AVC
Отправлено: 18.12.2006, 11:42


Ветеран

Группа: Модератор
Сообщений: 1583



Попробуйте поставить соответствующий charset у компонентов. VCL, в основном, не поддерживает многоязыковость.
Владимир
Отправлено: 18.12.2006, 11:52


Ученик-кочегар

Группа: Участник
Сообщений: 6



Вместо простого ComboBox поставил ComboBoxEx (у него текст типа WideString) и учтановил шрифт Times New Roman и EASTEUROPE_CHARSET.
В результате, к примеру, вместо буквы Т с хвостиком выводится только буква Т. А где же хвостик ?
AVC
Отправлено: 18.12.2006, 12:02


Ветеран

Группа: Модератор
Сообщений: 1583



>А где же хвостик ?
А кто его знает smile.gif Не пользуюсь этим компонентом.
Вот малость поигрался с базовыми компонентами (на GREEK_CHARSET)
StringGrid — показывает нормально
ComboBox — текущее значение — правильно, а вот сам список выбора в текущей (для системы) кодировке. Видимо "забыто" наследование шрифта.
Владимир
Отправлено: 18.12.2006, 12:27


Ученик-кочегар

Группа: Участник
Сообщений: 6



Вводить текст на румынском можно, а запихнуть его туда программно не получается — записываются буквы английского алфавита.
Владимир
Отправлено: 18.12.2006, 12:36


Ученик-кочегар

Группа: Участник
Сообщений: 6



Что же я не так сделал ?

Шрифт у StringGrid и ComboBox — Arial и EASTEUROPE_CHARSET

Должно получаться, к примеру "PEŞTE", а получается "PESTE"
Кстати, эти 2 слова имеют разное значение. sad.gif

CODE

       WideString tmp2 = tmp;
       for( int j = 1; j <= 10; j++ )
       {
           if( tmp2[j] == 0 )
               tmp2[j] = 0x0102;  // А с уголком вниз
           if( tmp2[j] == 1 )
               tmp2[j] = 0x00CE;  // I c уголком вверх
           if( tmp2[j] == 2 )
               tmp2[j] = 0x162;  // Т и внизу запятая
           if( tmp2[j] == 3 )
               tmp2[j] = 0x00C2;  // А с уголком вверх
           if( tmp2[j] == 4 )
               tmp2[j] = 0x015E;  // S и внизу запятая
       }
       if( !found )
       {
           memcpy( Product[MaxProduct], Item[MaxItem].item, 10 );
           ComboBox->Items->Add(tmp2);
           //ComboBox->Items->Add(Product[MaxProduct]);
           MaxProduct++;
       }
       StringGrid->Cells[0][MaxItem] = StrToInt(MaxItem+1);
       StringGrid->Cells[1][MaxItem] = tmp2;


Отредактировано Владимир — 18.12.2006, 12:39
Asher
Отправлено: 18.12.2006, 20:22


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.

Попробуйте вначале поставить что-то вроде
setlocale(LC_CTYPE, "rus_Russia.1251");
только страну и кодировку указать для Румынии.

Вернуться в Вопросы программирования в C++Builder