Форум: "Начинающим";
Текущий архив: 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.06 c