Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Национальные символы в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.114 c
2-1338803238
rioko
2012-06-04 13:47
2013.03.22
Работа с нетипизированными файлами более 2 гигабайт


2-1347623853
Ботаник
2012-09-14 15:57
2013.03.22
Приложение замораживается


15-1338371588
Dmitry87
2012-05-30 13:53
2013.03.22
Windows XP -> VirtualBox -> Windows 8


15-1343645986
Es
2012-07-30 14:59
2013.03.22
TcxComboBox, уведомление о Delete?


15-1329149862
Alex555
2012-02-13 20:17
2013.03.22
Можно ли как-то посмотреть вот это видео





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский