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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2012, 22:25   #1
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию DFM файл и китайские иероглифы

Приветствую Вас. Почти написал программу для перевода исходников с одного языка на другой (напр. с английского на русский). Столкнулся с проблемой перевода DFM файлов, в них находится Caption'ы всех контролов формы. Нашел в тырнете исходник для конвертации DFM файлов. Он прекрасно работает при конвертации DFM файла с английскими Caption'ами или русскими. Но при переводе DFM файла с китайского вместо символов Unicode (Китайских иероглифов) получаю только знаки вопросов. Подскажите пожалуйста что я не так делаю, почему так получается.
Спасибо за внимание к посту и всем ответившим.
Прилагаю так же исходник DFM конвертера, может быть проблема в нем.

Код:
procedure RemoveUnicodeFromDFM(const Filename: string);
  function isChanges(const S: string; var Res: string): Boolean;
  var
    len: Integer;
    function LexemSharp(var K: Integer): Boolean;
    begin
      Result := (K < len) and (S[K] = '#');
      if Result then
      begin
        inc(K);
        while (K <= len) and (S[K] in ['0'..'9']) do
          inc(K);
      end;
    end;
    function LexemAp(var K: Integer): Boolean;
    begin
      Result := (K < len) and (S[K] = '''');
      if Result then
      begin
        inc(K);
        while (K <= len) and (S[K] <> '''') do
          inc(K);
        if K <= len then
          inc(K);
      end;
    end;

    function Lexem(var K: Integer; var Str: string): Boolean;
    var
      Start: Integer;
      ValS: string;
    begin
      Result := False;
      Start := K;
      if LexemSharp(K) then
      begin
        ValS := Copy(S, Start + 1, K - Start - 1);
        Str := WideChar(StrToInt(ValS));
        Result := True;
      end
      else if LexemAp(K) then
      begin
        Str := Copy(S, Start + 1, K - Start - 2);
        Result := True;
      end;
    end;

    function Prepare(var K: Integer): string;
    var
      Str: string;
      WasLexem: Boolean;
    begin
      Result := '';
      WasLexem := False;
      while Lexem(K, Str) do
      begin
        Result := Result + Str;
        WasLexem := True;
      end;
      if Result <> '' then
        Result := '''' + Result + '''' + Copy(S, K, Length(S))
      else if not WasLexem then
        Result := S
      else
        Result := '''''';
    end;
    function Min(A, B: Integer): Integer;
    begin
      if A = 0 then
        Result := B
      else if B = 0 then
        Result := A
      else if A > B then
        Result := B
      else
        Result := A;
    end;

  var
    StartIdx: Integer;
  begin
    Result := False;
    StartIdx := Min(Pos('#', S), Pos('''', S));
    if StartIdx > 0 then
    begin
      len := Length(S);
      while (StartIdx <= len) and (not (S[StartIdx] in ['#', ''''])) do
        inc(StartIdx);
      if StartIdx < len then
      begin
        Res := Copy(S, 1, StartIdx - 1) + Prepare(StartIdx);
        Result := True;
      end;
    end;
  end;

var
  SList: TStringList;
  K: Integer;
  Res: string;
begin
  SList := TStringList.Create;
  try
    SList.LOADFROMFILE(Filename);
    for K := 0 to SList.Count - 1 do
      if isChanges(SList[K], Res) then
        SList[K] := Res;
    SList.SaveToFile(Filename);
  finally
    SList.Free;
  end;
end;

//////////////////////////////////////////////////////////////

procedure TForm1.Button1Click(Sender: TObject);
begin
RemoveUnicodeFromDFM('c:\file1.dfm');
end;
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ
Den7656 вне форума Ответить с цитированием
Старый 05.02.2012, 22:32   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Приветствую Вас. Почти написал программу для перевода исходников с одного языка на другой (напр. с английского на русский).
О_О ЗАЧЕМ!?
Человек_Борща вне форума Ответить с цитированием
Старый 05.02.2012, 22:43   #3
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию

Нужно перевести несколько очень больших проектов на Delphi с китайского на английский ))
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ
Den7656 вне форума Ответить с цитированием
Старый 05.02.2012, 22:59   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

1. имеем delphi не ниже 2009
2. имеем систему с уст. китайскими шрифтами
3. собираем конвертер на этой delphi
4. конвентируем проекты тоже на этой системе
или такаем китайские шрифты с собой.
Человек_Борща вне форума Ответить с цитированием
Старый 05.02.2012, 23:07   #5
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию

Все проекты написаны на семерке, вот в чем вся проблема, а портировать каждый-очень много времени ((
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ

Последний раз редактировалось Den7656; 05.02.2012 в 23:22.
Den7656 вне форума Ответить с цитированием
Старый 05.02.2012, 23:24   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Ну тогда танец с бубном или Free Pascal
Человек_Борща вне форума Ответить с цитированием
Старый 06.02.2012, 00:04   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если в dfm китайский, то там должен быть CHINESEBIG5_CHARSET. Не понятно как вы китайские иероглифы из него переведете на английский. По вашему коду не видно этого. Там конечно есть английские буквы и кириллица, но все же?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.02.2012 в 00:06.
Аватар вне форума Ответить с цитированием
Старый 06.02.2012, 00:42   #8
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию

Вот пример объекта из DFM, мне нужно чтобы вместо Caption = #31435#21363#33719#21462#27880#2087 6#20449#24687 были китайские иероглифы в Unicode кодировке.

Код:
object uPublU: TuPublU
  Left = 273
  Top = 205
  Width = 444
  Height = 246
  Caption = #31435#21363#33719#21462#27880#20876#20449#24687
  Color = clBtnFace
  Font.Charset = ANSI_CHARSET
  Font.Color = clWindowText
  Font.Height = -12
  Font.Name = #23435#20307
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 12
Вышеуказанная процедура заменяет значения только знаками вопросов. А если брать DFM от любого русского или англиского проекта то все значения нормально конвертируются. а если пробовать конвертировать вышеуказанный кусок кода то получается:

Код:
object uPublU: TuPublU
  Left = 273
  Top = 205
  Width = 444
  Height = 246
  Caption = '????'
  Color = clBtnFace
  Font.Charset = ANSI_CHARSET
  Font.Color = clWindowText
  Font.Height = -12
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 12
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ

Последний раз редактировалось Den7656; 06.02.2012 в 00:49.
Den7656 вне форума Ответить с цитированием
Старый 06.02.2012, 01:24   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

TuPublU - что за объект? Возможно он поддерживает UNICODE и те ваши числа и есть уже текcт в UNICODE. А может какой то другой код. С компонентом разберитесь. Ниже ваша строка, если ее трактовать как UNICODE, не понятно что с 5 и 7 символом
쭺獓랃홓豑潠
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.02.2012 в 01:26.
Аватар вне форума Ответить с цитированием
Старый 06.02.2012, 11:35   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

RemoveUnicodeFromDFM - название функции как-бы намекает что любому Unicode в DFM придёт капец и вы ещё как-то можете после этого удивляться пропаже символов вне текущей кодовой страницы?!
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование строк в *.dfm файлах. husker Помощь студентам 4 23.11.2011 08:21
Oшибка в dfm? nemets2011 Помощь студентам 2 15.10.2011 17:07
Полностью сохранить форму в файл как .dfm anton14 Общие вопросы Delphi 5 16.10.2010 18:42
Китайские телефоны - работают!? mv28jam Компьютерное железо 43 15.01.2010 18:06