|
|
Регистрация | << Правила форума >> | 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; Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. |
#8
|
||||
|
||||
Не получаеться всеравно вмсето текста получаеться каракули
Если Edit1.text:='世界您好'; то после сохранений получаю это NLuЁ`}Y @ Ђ)ў ч гЊ |
#9
|
||||
|
||||
так Edit работает со String, а вам нужно WideString.
Пишите свой компонент или ищите в инете готовый, который будет поддерживать юникод. P.S. вроде эта тема уже обсуждалась на этом форуме... если я чего не путаю... Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. |
#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, поддерживающий иникод. Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. |
#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; Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. |
#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; Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. |