Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.03.2009, 01:45
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание Сохранить в другой кодировке

Код:
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  
Старый 25.03.2009, 02:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Какая версия Дельфей?
Вроде, 2009 нативно поддерживает Unicode.
Во всех более ранних можно попробовать перекодировать руками, используя функции AnsiToUTF8 и Utf8ToUnicode. Ну и соотв. обратные...
Ответить с цитированием
  #3  
Старый 25.03.2009, 13:25
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

У меня обе версии стоят и 7-я и RAD Studio 2009 Delphi.....
но если сделать так как я указал выше - она сохраняеться в Кодировке ANSI - а мне надо чтоб она сохраняло все это в Кодировке UTF-8 или Юникод....
Ответить с цитированием
  #4  
Старый 26.03.2009, 14:14
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Добавлю еще одно...... сори я об этом забыл -
на Edit1 - Edit2 - Edit3 уже имееться текст с кодировкой Unicode - но почему то она сохраняет это в кодировке ANSI
а это приводит текст в не читаемое состояние потому что вместо не стантартных букв стоит значек вопроса ("??????")

Как это исправить?????
Ответить с цитированием
  #5  
Старый 26.03.2009, 23:04
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Прога тормозит иза сохранений - выручайтеееееееееееее....
Edit1.text:='世界您好';
после сохранений получаю ??????

помогиииииииитееееееееееееее!!!

прогу пишу на Delphi 2009
Ответить с цитированием
  #6  
Старый 27.03.2009, 11:43
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Как записать юникод строку в INI файл???????????
интересно как создаються Мультиязычные проги если эту гадость не получаеться создовать...
Ответить с цитированием
  #7  
Старый 27.03.2009, 12:55
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

вот так можно записать строку в файл в юникоде:
Код:
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  
Старый 27.03.2009, 15:22
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Не получаеться всеравно вмсето текста получаеться каракули
Если
Edit1.text:='世界您好';
то после сохранений получаю это NLuЁ`}Y @ Ђ)ў ч гЊ
Ответить с цитированием
  #9  
Старый 27.03.2009, 15:57
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

так Edit работает со String, а вам нужно WideString.
Пишите свой компонент или ищите в инете готовый, который будет поддерживать юникод.

P.S. вроде эта тема уже обсуждалась на этом форуме... если я чего не путаю...
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
  #10  
Старый 27.03.2009, 16:04
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Код:
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;
ну всеравно если использовать Widestring оно не работает - одни каракули
Ответить с цитированием
  #11  
Старый 27.03.2009, 16:17
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

wstr:= edit1.text ?
это как?

lstrcpyW(a, pchar(wstr));
и это как?

и, как я уже говорил, вам нужен компонент edit, поддерживающий иникод.
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
  #12  
Старый 27.03.2009, 16:26
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

У меня стоит Delphi 2009 и Edit поддерживает все языки даже если на китайском там писать оно отоброжаеться - просто мне надо создать INI файл в кодировке юникод чтоб строки там отоброжались нормально - чтоб потом их можно было читать...
проблема только в сохранении...оно по умолчанию сохроняет а ANSI
Ответить с цитированием
  #13  
Старый 27.03.2009, 16:52
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

тогда попробуйте так:
Код:
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  
Старый 27.03.2009, 18:00
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Даааа работает реально - теперь остался один такой вопрос ......смотрим на первый мой пост
видите мне надо сохранить параметры так как там написано - как это можно сделать? чтот код получиться громадным...
Ответить с цитированием
  #15  
Старый 27.03.2009, 18:50
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Функции 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 метра.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter