Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Национальные символы в Delphi   Найти похожие ветки 

 
Xmen   (2012-07-04 09:44) [0]

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


 
Anatoly Podgoretsky ©   (2012-07-04 10:14) [1]

> Xmen  (04.07.2012 09:44:00)  [0]

Нужно установить поддержку Юникода, набор компонент TMS


 
Xmen   (2012-07-04 10:44) [2]

а в firebird как загрузить из экселя такие символы? Попробовал потом посмотрел из IBExpert вопросики стоят вместо символов


 
Anatoly Podgoretsky ©   (2012-07-04 11:21) [3]


> поддержку Юникода

Нужна поддержка Юникода, Эксель он весь Юникодный


 
Xmen   (2012-07-04 12:10) [4]

Установил TntWare Delphi Unicode Controls.
Теперь можно с Экселя в Базу скачать данные и как?
Ни знаком с компонентой.


 
Xmen   (2012-07-04 12:14) [5]

Посмотрел пример с компонентой теперь понятно с отображением но не понятно с сохранением в базе Unicode


 
Омлет ©   (2012-07-04 12:19) [6]


> Кодировка базы Win1251

Переделай в UTF8.


 
Inovet ©   (2012-07-04 12:29) [7]

> [6] Омлет ©   (04.07.12 12:19)
> Переделай в UTF8.

Так автор говорит

> [0] Xmen   (04.07.12 09:44)
> поля в которых загружается вопросы и ответы в UTF8.


 
Xmen   (2012-07-04 12:39) [8]

Базу и таблицу сделал на UTF8 но все равно неполузается записат национальные символы. Вот кусок кода который пишет в базу из Excel. Может я чета упустил?

procedure TyuklForm.Button1Click(Sender: TObject);
const
  xlCellTypeLastCell = $0000000B;
var
  exl:OleVariant;
  WorkBook, Sheet : Variant;
  path,shname,x1,x2,x3,x4,x5,x6:string;
  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:=Trim(Sheet.Cells.Item[r,2].Value);
      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").AsString:=x1;
      dtsQuest.FieldByName("answer_a").AsString:=x2;
      dtsQuest.FieldByName("answer_b").AsString:=x3;
      dtsQuest.FieldByName("answer_c").AsString:=x4;
      dtsQuest.FieldByName("answer_d").AsString:=x5;
      dtsQuest.FieldByName("answer_correct").AsString:=x6;
      dtsQuest.post;
      inc(counts);
    end;
  trUni.CommitRetaining;
  Exl.Quit;
  Exl := Unassigned;
  Close;
end;


 
Плохиш ©   (2012-07-04 12:48) [9]


> Может я чета упустил?
>


>   path,shname,x1,x2,x3,x4,x5,x6:string;
>

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


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


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

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


 
DVM ©   (2012-07-04 13:05) [11]


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

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


> Xmen

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


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


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

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


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


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

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


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


> Xmen   (04.07.12 13:08) [12]


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

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

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


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


> Xmen   (04.07.12 12:39) [8]

Надо WideString + AsUnicodeString


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

сделал

  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:24) [17]

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


 
DVM ©   (2012-07-04 13:24) [18]


> Плохиш ©   (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.


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

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

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

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


 
DVM ©   (2012-07-04 13:26) [20]


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

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


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

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


 
DVM ©   (2012-07-04 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 например.


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


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

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


 
DVM ©   (2012-07-04 13:31) [24]


> Xmen   (04.07.12 13:27) [21]

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


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


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

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


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

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

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


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


> 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


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

сделал так
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;


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.308 c
2-1346166751
avil
2012-08-28 19:12
2013.03.22
tcombobox со своими правилами


15-1331135502
Jeer
2012-03-07 19:51
2013.03.22
С праздником Весны !


15-1345335302
Германн
2012-08-19 04:15
2013.03.22
Формат двоичного представления дробного числа


15-1334262603
Юрий
2012-04-13 00:30
2013.03.22
С днем рождения ! 13 апреля 2012 пятница


15-1344894739
Германн
2012-08-14 01:52
2013.03.22
OpenOffice