Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Национальные символы в Delphi [D7, XP]


Страницы:   1 2

Xmen ©   (2012-07-04 09:44:00) 

Как работать с национальными символами в Delphi.
Делаю прогу для теста. Сделали вопросы и ответы на Экселе с национальными символами. Их нужно загрузить в базу. Когда загрузил вместо национальных букв получил другие символы (=, +, ?). Как правильно загрузить и правильно  показать в проге нац. символы. База Firebird 2.1. Кодировка базы Win1251, поля в которых загружается вопросы и ответы в UTF8.


Плохиш   (2012-07-04 15:23:00) [1]


>   exl:=CreateOleObject('Excel.Application');
>

Ничего сказать не могу, я через dataset читаю.


Xmen   (2012-07-04 14:16:00) [2]

сделал так
TntLabel1.Caption:=x1;
не получился
может я из экселя не так читаю

procedure TyuklForm.Button1Click(Sender: TObject);
const
  xlCellTypeLastCell = $0000000B;
var
  exl:OleVariant;
  WorkBook, Sheet : Variant;
  path,shname:string;
  x1,x2,x3,x4,x5,x6:WideString;
  counts,r,exl_count:integer;
begin
  counts:=0;
  path:= ExtractFilePath(Application.ExeName);
  shname:=ExtractFileName(Edit1.Text);
  exl:=CreateOleObject('Excel.Application');
  Workbook:=exl.Application.WorkBooks.Add(Edit1.Text);
  Sheet:=WorkBook.WorkSheets[1];
  exl_count:=200;
  dtsQuest.Open;
  for r:=1 to exl_count do
    begin
      x1:=Sheet.Cells.Item[r,2].Value;
      TntLabel1.Caption:=x1;
      x2:=Trim(Sheet.Cells.Item[r,3].Value);
      x3:=Trim(Sheet.Cells.Item[r,4].Value);
      x4:=Trim(Sheet.Cells.Item[r,5].Value);
      x5:=Trim(Sheet.Cells.Item[r,6].Value);
      x6:=Trim(Sheet.Cells.Item[r,7].Value);

      dtsQuest.Insert;
      dtsQuest.FieldByName('question').Value:=x1;
      dtsQuest.FieldByName('answer_a').Value:=x2;
      dtsQuest.FieldByName('answer_b').AsVariant:=x3;
      dtsQuest.FieldByName('answer_c').AsVariant:=x4;
      dtsQuest.FieldByName('answer_d').AsVariant:=x5;
      dtsQuest.FieldByName('answer_correct').AsString:=x6;
      dtsQuest.post;
      inc(counts);
    end;
  trUni.CommitRetaining;
  Exl.Quit;
  Exl := Unassigned;
  Close;
end;


Xmen   (2012-07-04 14:11:00) [3]


> DVM ©   (04.07.12 13:28) [22]
>
>
> > Xmen   (04.07.12 13:24) [19]
> > проревел здесь
> >
> >       x1:=Trim(Sheet.Cells.Item[r,2].Value);
> >
> > все равно не читает нац. символы
> > то есть не получился с этим
> > x1,x2,x3,x4,x5,x6:WideString;
> >
> >
>
> ты x1 куда выводишь? в какой то Tnt контрол? Если так проверь
> шрифт там еще, поставь юникодный Tahoma например.

нет я проверяю по F7


Плохиш   (2012-07-04 13:54:00) [4]

2. Сделай trim на содержимое x1

x1:=Sheet.Cells.Item[r,2].Value;
x1 := trim(x1);


Плохиш   (2012-07-04 13:52:00) [5]


> Xmen   (04.07.12 13:24) [19]
>
> проревел здесь
>
>       x1:=Trim(Sheet.Cells.Item[r,2].Value);
>
> все равно не читает нац. символы

Выведи x1 в какой-либо визуальный tnt-компонент.


DVM   (2012-07-04 13:31:00) [6]


> Xmen   (04.07.12 13:27) [21]

Еще проверь (я не помню как в D7) функция Trim вообще имеет перегруженный вариант принимающий параметр WideString


Xmen   (2012-07-04 13:28:00) [7]


>
> > DVM ©   (04.07.12 13:24) [18]
>
> но это все изврат, лучше перейти на юникодную версию делфи
> при возможности.

У меня уже готовая прога на седьмом наверно много времени уйдет для перехода более младшую версию


DVM   (2012-07-04 13:28:00) [8]


> Xmen   (04.07.12 13:24) [19]
> проревел здесь
>
>       x1:=Trim(Sheet.Cells.Item[r,2].Value);
>
> все равно не читает нац. символы
> то есть не получился с этим
> x1,x2,x3,x4,x5,x6:WideString;
>
>

ты x1 куда выводишь? в какой то Tnt контрол? Если так проверь шрифт там еще, поставь юникодный Tahoma например.


Xmen   (2012-07-04 13:27:00) [9]

У меня когда идет чтения из Экселя не получается работать с нац символами.


DVM   (2012-07-04 13:26:00) [10]


> DVM ©   (04.07.12 13:24) [18]

но это все изврат, лучше перейти на юникодную версию делфи при возможности.


Xmen   (2012-07-04 13:24:00) [11]

проревел здесь

      x1:=Trim(Sheet.Cells.Item[r,2].Value);

все равно не читает нац. символы
то есть не получился с этим
x1,x2,x3,x4,x5,x6:WideString;


DVM   (2012-07-04 13:24:00) [12]


> Плохиш ©   (04.07.12 13:09) [13]


> С каких пор делфи стал оперировать напрямую UTF8String и
> в каком месте приведённого кода используются эти UTF8String?
>

Если у него база Firebird UTF8, поле в базе UTF8, при коннекте к базе указано UTF8 то при работе из не юникодной делфи с неюникодными компонентами IBX все равно можно считать и записать строку UTF8 в/из такую базу.
Но, нельзя отобразить без преобразования. Я не знаю какой кодировкой оперирует Excel.Application, скорее всего UTF-16LE (представлено типом WideString), если так, то небольшое добавление поможет сохранить данные в базу dtsQuest.FieldByName('answer_d').AsString:=UTF8Encode(x5); Само собой x5 надо объявить WideString.


Плохиш   (2012-07-04 13:24:00) [13]

Изучай настройки бд и строки подключения.


Xmen   (2012-07-04 13:22:00) [14]

сделал

  x1,x2,x3,x4,x5,x6:WideString;


      dtsQuest.FieldByName('question').Value:=x1;
      dtsQuest.FieldByName('answer_a').Value:=x2;
      dtsQuest.FieldByName('answer_b').AsVariant:=x3;
      dtsQuest.FieldByName('answer_c').AsVariant:=x4;
      dtsQuest.FieldByName('answer_d').AsVariant:=x5;

неполучился


Омлет   (2012-07-04 13:15:00) [15]


> Xmen   (04.07.12 12:39) [8]

Надо WideString + AsUnicodeString


Плохиш   (2012-07-04 13:11:00) [16]


> Xmen   (04.07.12 13:08) [12]


> string чем поменят? WideSringом?

У тебя есть много вариантов для выбора?

И во-втором случае никаких AsString


Плохиш   (2012-07-04 13:09:00) [17]


> вообще говоря строка UTF8String есть AnsiString и следовательно
> запись ее и чтение с помощью  dtsQuest.FieldByName('question').
> AsString вполне возможна

С каких пор делфи стал оперировать напрямую UTF8String и в каком месте приведённого кода используются эти UTF8String?


Xmen   (2012-07-04 13:08:00) [18]


> Плохиш ©   (04.07.12 12:48) [9]
>
>
> > Может я чета упустил?
> >
>
>
> >   path,shname,x1,x2,x3,x4,x5,x6:string;
> >
>
> Это не юникод.

string чем поменят? WideSringом?


DVM   (2012-07-04 13:05:00) [19]


> Это не юникод.

вообще говоря строка UTF8String есть AnsiString и следовательно запись ее и чтение с помощью  dtsQuest.FieldByName('question'). AsStringвполне возможна, но там будет UTF8String и без преобразования это будут крякозябры в интерфейсе, но потерь не будет скорее всего. Другая проблема может подстерегать при попытке вычислить длину такой строки с помощью Length - получим длину в байтах но не символах.


> Xmen

Лучше все же перейти на делфи с поддержкой юникода.


Плохиш   (2012-07-04 12:53:00) [20]


>       dtsQuest.FieldByName('question'). AsString:=x1;
>

И это 99% не юникод.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо