Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> unicode и модуль encddecd, бьются мат символы 
V
    Опции темы
lebaon
Дата 7.12.2010, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 10.3.2006

Репутация: нет
Всего: нет



Здравствуйте!
возникла такая задача - хранить в бд математические символы в кодировке unicode,
например, символ корня

бд имеет кодировку ansi

поэтому я решил закодировать unicode строку в base64, и использовал для этого стандартные ф-ии
EncodeString и DecodeString из модуля EncdDecd
Но возникла проблема - после раскодировки спец символы заменяются похожими по написанию символами англ раскладки
Вопрос: как правильно преобразовать unicode строку в base64 и обратно так, что б спец символы не побились?

delphi 2010


PM MAIL ICQ   Вверх
CodeMonkey
Дата 7.12.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Пример кода.

Использование:

Код
function EncodeString(const AData: String): AnsiString;
var
  Sz: Integer;
  PIn, POut: Pointer;
begin
  PIn := Pointer(AData);
  Sz := Length(AData) * SizeOf(Char);

  if Sz > 0 then
  begin
    SetLength(Result, CalcEncodedSize(Sz));
    POut := Pointer(Result);

    Base64Encode(PIn^, Sz, POut^);
  end
  else
    Result := '';
end;

function DecodeString(const ABase64: AnsiString): String;
var
  Sz: Integer;
  PIn, POut: Pointer;
begin
  PIn := Pointer(ABase64);
  Sz := Length(ABase64);

  if Sz > 0 then
  begin
    SetLength(Result, CalcDecodedSize(PIn^, Sz) div 2);
    POut := Pointer(Result);

    Base64Decode(PIn^, Sz, POut^);
  end
  else
    Result := '';
end;



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
lebaon
Дата 7.12.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 10.3.2006

Репутация: нет
Всего: нет



вылетает в CalcDecodedSize  smile 
Код

function CalcDecodedSize(const InBuffer; InSize: DWord): DWord;
begin
  Result := 0;
  if InSize = 0 then
    Exit;
  if (InSize mod 4 <> 0) then
    Exit;

  Result := InSize div 4 * 3;
  if (PByte(DWord(InBuffer) + InSize - 2)^ = Ord(Base64Filler)) then // здесь - вылет
    Dec(Result, 2)
  else
  if (PByte(DWord(InBuffer) + InSize - 1)^ = Ord(Base64Filler)) then
    Dec(Result);
end;


PM MAIL ICQ   Вверх
lebaon
Дата 7.12.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 10.3.2006

Репутация: нет
Всего: нет



все, разобрался  smile 
 в коде DecodeString была ошибка
вот исправленный вариант 
Код

function DecodeString(const ABase64: AnsiString): String;
var
  Sz: Integer;
  PIn, POut: Pointer;
begin
  PIn := Pointer(ABase64);
  Sz := Length(ABase64);
  if Sz > 0 then
  begin
    SetLength(Result, CalcDecodedSize(PIn, Sz) div 2); // вызов через PIn^ неправилен
    POut := Pointer(Result);
    Base64Decode(PIn^, Sz, POut^);
  end
  else
    Result := '';
end;


спасибо, CodeMonkey!

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.