Перейти к содержанию
Fire Monkey от А до Я
  • 0

Кодировка под Android


neo

Вопрос

Привет!

 

народ чего то не получается под андройдом из файла получить строку в нужной кодировке...

 

вот так получаю строку

function ReadStreamStr(Stream: TStream): String;
var
  StrLen: Integer;
begin
  Result:='';
  Stream.ReadBuffer(StrLen,SizeOf(Integer));

  SetLength(Result,StrLen);
  Stream.Read(Result[1],StrLen);
end;

function LoadData: String;
var
  Stream: TMemoryStream;
begin
  Stream:= TMemoryStream.Create;
  try
  Stream.LoadFromFile(TPath.GetDocumentsPath + PathDelim +'access.key');
  Stream.Seek(0,soFromBeginning);

  Result:=ReadStreamStr(Stream);
  finally
  Stream.Free;
  end;
end;

в LoadData строка

далее декодирую её

function StringOf(str: String): String;
var
Bytes: TBytes;
begin
Bytes := BytesOf(str);
  if Assigned(Bytes) then
    Result := TEncoding.ANSI.GetString(Bytes, Low(Bytes), High(Bytes) + 1)
  else
    Result := '';
end;

но всё равно килиберда получается =(

Изменено пользователем neo
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

строку в файл сохраняю вот так

procedure WriteStreamStr(Stream: TStream; Str: string);
var
  StrLen: Integer;
begin
  StrLen:=Length(Str);
  Stream.WriteBuffer(StrLen,SizeOf(Integer));

  if StrLen>0 then Stream.Write(Str[1], StrLen);
end;

procedure SaveData(Info: String);
var
  Stream: TMemoryStream;
begin
  Stream:= TMemoryStream.Create;
  try
  Stream.Seek(0,soFromBeginning);
  WriteStreamStr(Stream,Info);
  Stream.SaveToFile('access.key');
  finally
  Stream.Free;
  end;
end;

Изменено пользователем neo
Ссылка на комментарий
  • 0

И это все просто чтобы считать/записать строку?

ну да =)

вот так вызываю..

edit1.text:=StringOf(LoadData);

просто размер кажется большим из за того что каждую часть разнёс по функциям/процедурам

тк они используются ещё и для других целей

И это все просто чтобы считать/записать строку?

если ты умеешь делать это одной строкой то можешь поделится =)

Ссылка на комментарий
  • 0

 

Один из вариантов:

  with TStringStream.Create do
  try
    LoadFromFile('d:\11.txt');
    Edit1.Text := DataString;
  finally
    Free;
  end;

это если файл просто текстовый... а у меня там сначала идёт размер строки... у меня в ключевой файл пишется несколько параметров типа IMEI итд

Ссылка на комментарий
  • 0

итак расскажу о своём опыте... вдруг кому-то будет полезно

попробовал максимально простым способом записать/считать строку в файле
 

procedure WriteToFile(s: String);
var
  f: TMemoryStream;
begin
  f:=TMemoryStream.Create;
  try
    f.Write(S[1], Length(s));
    f.SaveToFile(TPath.GetDocumentsPath + PathDelim +'access.key');
  finally
    f.Free;
  end;
end;

function GetTextFromFile: string;
begin
  with TStringStream.Create do
  try
    LoadFromFile(TPath.GetDocumentsPath + PathDelim +'access.key');
    Result:=DataString;
  finally
    Free;
  end;
end;

но тоже ничего не получилось...
в XE8 под android нету ShortString и AnsiString
поэтому скачал их отдельно и изменил на WriteToFile(s: ShortString);
и всё заработало...

не понятно только зачем их убрали? и как сдалать без них?

 

вот ссылка на ShortString и AnsiString http://www.fmxexpress.com/use-ansistring-and-utf8string-in-delphi-xe5-firemonkey-on-android-and-ios/

Изменено пользователем neo
Ссылка на комментарий
  • 0
with TStringStream.Create do
try
LoadFromFile('d:\11.txt', TEncoding.UTF8);
Edit1.Text := DataString;
finally
Free;
end;

всё что нужно было

 

не... в андройде так не компилируется (Too many actual parameters)

 

но пробовал вот так первые 5 симв в utf8 декодировать тоже не работает

 m:=TMemoryStream.Create;
  m.LoadFromFile(TPath.GetDocumentsPath + PathDelim +'access.key');
  m.Seek(0,soFromBeginning);

  SetLength(Bytes,5);
  m.Read(Bytes,5);

  Result:=TEncoding.UTF8.GetString(Bytes,Low(Bytes),High(Bytes)+1);
Изменено пользователем neo
Ссылка на комментарий
  • 0

а with разве еще не убрали из языка? обещали вроде

ss:= TStringStream.Create;
try
  ss.LoadFromFile('d:\11.txt', TEncoding.UTF8);
  Edit1.Text := ss.DataString;
finally
  ss.Free;
end;

для работы с более сложными файлами хорошо подходит TSreamReader/TStreamWriter 

там есть и Read/WriteString и Read/WriteInteger и т.д.

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0
  • Модераторы

В какой кодировке у вас файл?

  with TStringList.Create do
    LoadFromFile('c:\q.txt', TEncoding.UTF8);

так грузит текст в UTF-8 кодировке

Ссылка на комментарий
  • 0

а with разве еще не убрали из языка? обещали вродe

для работы с более сложными файлами хорошо подходит TSreamReader/TStreamWriter

там есть и Read/WriteString и Read/WriteInteger и т.д.

в XE8, with всё ещё есть...

без него тоже не прокатывает... а вот TSreamReader/TStreamWriter пригодился =) спасибо классный метод

В какой кодировке у вас файл?

  with TStringList.Create do
    LoadFromFile('c:\q.txt', TEncoding.UTF8);

так грузит текст в UTF-8 кодировке

уже всё заработало через TSreamReader/TStreamWriter =)

Ссылка на комментарий
  • 0

 

В какой кодировке у вас файл?

  with TStringList.Create do
    LoadFromFile('c:\q.txt', TEncoding.UTF8);

так грузит текст в UTF-8 кодировке

уже всё заработало через TSreamReader/TStreamWriter =)

 

Можете показать пример результата, спасибо.

Ссылка на комментарий
  • 0

если честно, не хочется подсказывать как не надо делать 

лучше подсказывать, куда смотреть для решения задач хранения структурированных данных

например для ini файла можно вот

или

воспользоваться https://github.com/onryldz/x-superobject

там все понятно на примерах и очень удобно

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...