Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2013, 20:38   #1
Khayzenberg
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 54
Вопрос Проблема с юникодом при сохранении в файл символа.

Доброго времени суток! Есть следующая процедура:
Код:
procedure TfrmMain.Button1Click(Sender: TObject);
var mtf:TStringList;
    ch:WideChar;
begin
 mtf:=TStringList.Create;
 ch:=#9731;
 mtf.Append(ch);
 mtf.SaveToFile('c:\temp\3.txt');
 FreeAndNil(mtf);
 mtf:=TStringList.Create;
 mtf.LoadFromFile('c:\temp\3.txt');
 ch:=mtf[0][1];
 Memo1.Lines.Append(IntToStr(Ord(ch)));
 FreeAndNil(mtf);
end;
Назначение ее следующее, она сохраняет в файл символ с таблицы юникода(снеговик) посредством TStringList. А при чтении с файла символа, уже считывается не снеговик а знак вопроса с кодом > 63.
И как исправить эту несправность?

Последний раз редактировалось Stilet; 21.02.2013 в 22:01.
Khayzenberg вне форума Ответить с цитированием
Старый 21.02.2013, 22:03   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ты проверил в файле действительно сохранится 9731h?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.02.2013, 06:41   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

TStringList.Text - это String. А тут нужно явно указать, что это WideString. Или используйте File of WideChar или как-то так
Код:
type
  TByteArray = Array of Byte;
var
  SL: TStringList;
  ws: WideString;
  s: String;
begin
  ws := #9731;
  s := String (TByteArray (ws));

  SL := TStringList.Create;
  SL.Text := s;
  SL.SaveToFile('d:\temp\3.txt');
  FreeAndNil(SL);

  SL := TStringList.Create;
  SL.LoadFromFile('d:\temp\3.txt');
  s := SL.Text;
  FreeAndNil(SL);

  ws := WideString (TByteArray (s));
  Memo1.Lines.Append(IntToStr(Ord(ws[1])));
end;
Sibedir вне форума Ответить с цитированием
Старый 22.02.2013, 07:54   #4
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

В последних версиях дельфина есть TEncoding
FaTaL вне форума Ответить с цитированием
Старый 22.02.2013, 13:27   #5
Khayzenberg
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 54
По умолчанию

Благодарю всех за ответы самый лучший способ это при сохранении и загрузки файлов дописать второй параметр: TEncoding.Unicode

Код:
SL.SaveToFile('c:\temp\3.txt', TEncoding.Unicode);
....
SL.LoadFromFile('c:\temp\3.txt', TEncoding.Unicode);
Khayzenberg вне форума Ответить с цитированием
Старый 23.02.2013, 10:22   #6
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Лучший то он может быть лучший. Но это если только у тебя одна из последних версий дельфина. Хотя я сам сторонник, чтобы люди писали на последних версиях. не зря же Embarcadero старается для нас.
FaTaL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема при сохранении в csv макросом OhNoes Microsoft Office Excel 2 19.10.2012 18:43
Проблема с кодировкой именно при сохранении текста в БД. Leximus БД в Delphi 0 16.02.2012 11:56
Макрос при сохранении Полина Л. Помощь студентам 0 14.09.2009 16:30
ошибка в сохранении в файл Лонли-Локли Общие вопросы Delphi 1 27.08.2009 14:51
Проблема с армянским языком и юникодом!!! artush1984 Общие вопросы C/C++ 3 19.08.2009 20:23