![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Национальные символы в Delphi [D7, XP]
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% не юникод.