![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Код:
F := TIniFile.Create(path+edit4.text+'.ini');
F.WriteString('Data', 'Name', Edit1.Text);
F.WriteString('Data', 'Adress', Edit2.Text);
F.WriteString('Data', 'Mobile', Edit3.Text);
F.free;Как сделать чтоб INI файл сохранялся в кодировке ЮНИКОД или UTF-8???? |
|
#2
|
|||
|
|||
|
Какая версия Дельфей?
Вроде, 2009 нативно поддерживает Unicode. Во всех более ранних можно попробовать перекодировать руками, используя функции AnsiToUTF8 и Utf8ToUnicode. Ну и соотв. обратные... |
|
#3
|
||||
|
||||
|
У меня обе версии стоят и 7-я и RAD Studio 2009 Delphi.....
но если сделать так как я указал выше - она сохраняеться в Кодировке ANSI - а мне надо чтоб она сохраняло все это в Кодировке UTF-8 или Юникод.... |
|
#4
|
||||
|
||||
|
Добавлю еще одно...... сори я об этом забыл -
на Edit1 - Edit2 - Edit3 уже имееться текст с кодировкой Unicode - но почему то она сохраняет это в кодировке ANSI а это приводит текст в не читаемое состояние потому что вместо не стантартных букв стоит значек вопроса ("??????") Как это исправить????? |
|
#5
|
||||
|
||||
|
Прога тормозит иза сохранений - выручайтеееееееееееее....
Edit1.text:='世界您好'; после сохранений получаю ?????? помогиииииииитееееееееееееее!!! прогу пишу на Delphi 2009 |
|
#6
|
||||
|
||||
|
Как записать юникод строку в INI файл???????????
интересно как создаються Мультиязычные проги если эту гадость не получаеться создовать... |
|
#7
|
||||
|
||||
|
вот так можно записать строку в файл в юникоде:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
w: hwnd;
x: dword;
a: array[0..10] of widechar;
begin
w:= CreateFileW('c:\ss.ini', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
lstrcpyW(a, 'Hello world');
WriteFile(w, a[0], SizeOf(a), x, nil);
CloseHandle(w);
end; |
|
#8
|
||||
|
||||
|
Не получаеться всеравно вмсето текста получаеться каракули
Если Edit1.text:='世界您好'; то после сохранений получаю это NLuЁ`}Y @ Ђ)ў ч гЊ |
|
#9
|
||||
|
||||
|
так Edit работает со String, а вам нужно WideString.
Пишите свой компонент или ищите в инете готовый, который будет поддерживать юникод. P.S. вроде эта тема уже обсуждалась на этом форуме... если я чего не путаю... |
|
#10
|
||||
|
||||
|
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
w: hwnd;
x: dword;
a: array[0..10] of widechar;
wstr: widestring;
begin
wstr:= edit1.text;
w:= CreateFileW('c:\ss.ini', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
lstrcpyW(a, pchar(wstr));
WriteFile(w, a[0], SizeOf(a), x, nil);
CloseHandle(w);
end; |
|
#11
|
||||
|
||||
|
wstr:= edit1.text ?
это как? lstrcpyW(a, pchar(wstr)); и это как? и, как я уже говорил, вам нужен компонент edit, поддерживающий иникод. |
|
#12
|
||||
|
||||
|
У меня стоит Delphi 2009 и Edit поддерживает все языки даже если на китайском там писать оно отоброжаеться - просто мне надо создать INI файл в кодировке юникод чтоб строки там отоброжались нормально - чтоб потом их можно было читать...
проблема только в сохранении...оно по умолчанию сохроняет а ANSI |
|
#13
|
||||
|
||||
|
тогда попробуйте так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
w: hwnd;
x: dword;
s: PWideChar;
begin
GetMem(s, 256);
StringToWideChar(Edit1.Text, s, Length(Edit1.Text)+1);
w:= CreateFileW('c:\ss.ini', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
WriteFile(w, s[0], lstrlenW(s)*2, x, nil);
CloseHandle(w);
FreeMem(s, 256);
end; |
|
#14
|
||||
|
||||
|
Даааа работает реально - теперь остался один такой вопрос ......смотрим на первый мой пост
видите мне надо сохранить параметры так как там написано - как это можно сделать? чтот код получиться громадным... |
|
#15
|
||||
|
||||
|
Функции WinAPI WritePrivateProfileStringA и WritePrivateProfileStringW сохраняют текст а ANSI, поэтому придется самому писать функции записи в ini файл (а для чтения подойдет и готовая WinAPI функция GetPrivateProfileStringW).
Т.е. записываем вручную, а читаем через GetPrivateProfileStringW. Код:
//записываем
procedure TForm1.Button2Click(Sender: TObject);
var
w: hwnd;
x, l: dword;
s: PWideChar;
begin
l:= Length(Edit1.Text)*2 + Length('[aa]' + #13#10 + 'gg=')*2 + 1; // вычисляем длину юникодовой строки (в строке каждый символ занимает 2 байта + 1 байт управляющий)
GetMem(s, l);
StringToWideChar('[aa]' + #13#10 + 'gg=' + Edit1.Text, s, 256);
w:= CreateFileW('c:\ss.ini', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
WriteFile(w, s[0], lstrlenW(s)*2, x, nil);
CloseHandle(w);
FreeMem(s, l);
end;
//читаем
function Set_ReadString(const Section, Ident, Default: string): string; // аналог функции измодуля IniFiles, но с поддержкой юникода
var
Buffer: array[0..2047] of WideChar;
begin
SetString(Result, Buffer, GetPrivateProfileStringW(StringToOleStr(Section),
StringToOleStr(Ident), StringToOleStr(Default), Buffer, SizeOf(Buffer), 'c:\ss.ini'));
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Edit1.Text:= Set_ReadString('aa', 'gg', '');
end; |