Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5 6 7   вперед  Ctrl      все
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Fr0sT-Brutal,

Так нужны ведь. Мне например, нужны. И вообще есть горы софта, которые работают без поддержки Юникода. Переписывание софта или переход на другие версии с поддержкой УТФ это в любом случае новые баги, недовольства пользователей и прочее. Не говоря про то, что есть куча старого софта, который заброшен и который вообще некому переписывать.
7 апр 21, 14:00    [22305410]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Этот старый софт не пытается говорить по-русски с французами.

Серьёзно повторяю предложение задействовать TNT Unicode Controls и не парить моск.

Posted via ActualForum NNTP Server 1.5

7 апр 21, 14:05    [22305413]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
avp_
Fr0sT-Brutal
ACP должны умереть.

К чему такой фашизм? Горы софта написано который работает и делает своё дело.

К тому, что это гемор и пережиток темного прошлого. Аналоговое ТВ сдохло, и кодовые страницы должны сдохнуть тоже.
7 апр 21, 14:24    [22305420]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Dimitry Sibiryakov,

Так TNT надо было использовать с самого начала а в идеале и писать на Delphi 2010 сначала, а не на 7 ... А теперь нереально на него переписать десятки тысяч строк кода ...
7 апр 21, 14:42    [22305432]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207

на ТНТ перейти гораздо проще, чем на новые версии Delphi.

Posted via ActualForum NNTP Server 1.5

7 апр 21, 14:45    [22305435]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Fr0sT-Brutal,

"Наверно, можно перехватывать SetWindowText и в случае acp=utf8 конвертировать строки на лету" - как ни странно - но похоже, что сработало. Пожалуй, использую это, чтобы временно решить проблему сейчас.

Но всё равно буду готовить софт к переходу на Delphi 2010 (он юникодный, с него вероятно будет проще перейти на Delphi XE10 в дальнейшем). Delphi 7 рано или поздно умрёт, наверное лучше переходить на D2010, чем на TntComponents (скорее всего и то и то потребует сопоставимо усилий).
7 апр 21, 14:46    [22305437]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Мимопроходящий,

а что делать со старым кодом, который работает с кучей Edits, Grids, DBGrids итд?
7 апр 21, 14:47    [22305438]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Анна Петровна
а что делать со старым кодом, который работает с кучей Edits, Grids, DBGrids итд?

Назвать новые контролы так же как старые, чтобы имеющийся код ничего не заметил?..

Posted via ActualForum NNTP Server 1.5

7 апр 21, 14:50    [22305440]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
GunSmoker
Member

Откуда:
Сообщений: 3210
Я бы для начала выяснил причину кракозябров в D7. На каком конкретно шаге "не так". Может, там просто всё решается.
7 апр 21, 15:21    [22305458]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1299
Анна Петровна
...
А в Delphi 2010 - проблема такая, что модули VCL идут вообще без исходного кода. Так что непонятно как их модифицировать чтобы сохранить все хаки,сделанные в Delphi 7.
Это какая-то неправильная Delphi 2010 у вас. Исходники VCL в обычной Pro версии есть, как и в более поздних.
7 апр 21, 15:32    [22305466]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
alekcvp
Member

Откуда:
Сообщений: 2792
Тут, по-моему, выход только один: на текущий момент предлагать пользователю отключать эту настройку, которая мешает работать программе, и параллельно начать писать новую версию программы без быдлокода и на современной версии (возможно даже не дельфи, но это по желанию). Иначе в один далеко не прекрасный момент вы столкнётесь с чем-то, что уже не сможете обойти и выхода у вас не будет.
7 апр 21, 15:47    [22305473]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Кстати, помогло создание обёрток в виде, представленном ниже. Это работает с Buttons, но не работает с Edits.

type
TUtfButton=class(TButton)
public
procedure SetCaption(s: string);
function GetCaption: string;
property Caption: string read GetCaption write SetCaption;
end;
TButton=class(TUtfButton)
end;

......................

var
mode: integer=0;

procedure TUtfButton.SetCaption(s: string);
begin
if mode=0 then
inherited Caption := s
else
inherited Caption := AnsiToUtf8(s);
end;

function TUtfButton.GetCaption: string;
begin
if mode=0 then
result := inherited Caption
else
result := Utf8ToAnsi(inherited Caption);
end;

....................

BEGIN
if GetACP=65001 then mode:=1;
END.



Главная проблема с Edits - всё работает нормально (даже без обёрток) - если работать с ними с помощью программного кода. Если же стартовое значение Edit было присвоено в свойствах формы (dfm) - в этом случае загружаются крякозябры и расшифровать их уже невозможно. Ч так понимаю, что-то нужно делать в методе

F.ReadComponent(Self)

чтобы Edits загружались из dfm в верной кодировке ...
7 апр 21, 15:56    [22305485]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
alekcvp
Member

Откуда:
Сообщений: 2792
Анна Петровна

Главная проблема с Edits - всё работает нормально (даже без обёрток) - если работать с ними с помощью программного кода. Если же стартовое значение Edit было присвоено в свойствах формы (dfm) - в этом случае загружаются крякозябры и расшифровать их уже невозможно. Ч так понимаю, что-то нужно делать в методе
F.ReadComponent(Self)
чтобы Edits загружались из dfm в верной кодировке ...

Тупо переделать всё на программную инициализацию не предлагать?..
7 апр 21, 16:11    [22305495]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5101
Анна Петровна,

Перехватывать WM_SETTEXT/WM_GETTEXT.
7 апр 21, 16:13    [22305497]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
Анна Петровна
Главная проблема с Edits - всё работает нормально (даже без обёрток) - если работать с ними с помощью программного кода. Если же стартовое значение Edit было присвоено в свойствах формы (dfm) - в этом случае загружаются крякозябры и расшифровать их уже невозможно. Ч так понимаю, что-то нужно делать в методе

F.ReadComponent(Self)

чтобы Edits загружались из dfm в верной кодировке ...

Самый простой и топорный способ - позаменять во всех dfm TEdit => TUtf8Edit. Ну и TUtf8Edit полноценно зарегистрировать в среде как компонент
7 апр 21, 16:21    [22305510]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
GunSmoker
Я бы для начала выяснил причину кракозябров в D7. На каком конкретно шаге "не так". Может, там просто всё решается.

Так наверняка при описанном режиме *A функции перегоняются в *W предполагая, что на входе utf8. Конечно, когда там на самом деле 1251, получается лажа.
7 апр 21, 16:25    [22305518]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
alekcvp,

Походу - решается вопрос без перехода на программную реализацию (перейти нереально - там десятки тысяч строк кода).

При создании формы загружаем из dfm копию компонента - она загрузится в память в ANSI без всяких там перекодировок UTF8 и UTF16. А дальше уже - присваиваем компонентам формы значения из копии - перекодируя с помощью AnsiToUtf8.

В этом случае получается то же самое - как и в случае программной реализации. Присваиваем значения точно также программно - только считывая их из копии DFM.
7 апр 21, 16:36    [22305524]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Fr0sT-Brutal,

Там всё гораздо хуже. В dfm похоже, что всё хранится в UTF-16, а при чтении из свойства Text компонента - в UTF-8. И при загрузке из dfm русские буквы как-то хитро перекодируются - причём с потерей данных. Например, в Edit был в dfm текст "Песик", 5 символов (не смейтесь, тестировала), а при чтении свойства Edit из свойства Text получалось 6-символьные крякозябры. Записала значение в файл. Открываю в FAR, а там в кодировке 65001 слово "Пес". То есть часть информации потерялась.

Поэтому - либо значения Edits не хранить в dfm - либо грузить копию dfm при создании формы - перекодируя как нужно в UTF-8.
7 апр 21, 16:42    [22305532]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207
Анна Петровна
Походу - решается вопрос без перехода на программную реализацию (перейти нереально - там десятки тысяч строк кода).

При создании формы загружаем из dfm копию компонента - она загрузится в память в ANSI без всяких там перекодировок UTF8 и UTF16. А дальше уже - присваиваем компонентам формы значения из копии - перекодируя с помощью AnsiToUtf8.

В этом случае получается то же самое - как и в случае программной реализации. Присваиваем значения точно также программно - только считывая их из копии DFM.
можно создать компонент, который будет этим заниматься.
Примерно так:
type
  TCustomFormStore = class(TComponent)
  protected
    procedure Loaded; override;
  end;

implementation

procedure TCustomFormStore.Loaded;
begin
  inherited;
  if not (csDesigning in ComponentState) and Assigned(Owner) and (Owner is TForm) then
    begin
{  перебираем компоненты и конвертируем проперти }
    end;
end;
7 апр 21, 16:43    [22305533]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Мимопроходящий,

Да, именно об этом и речь - только у Вас возможно красивее и проще. Способ, в принципе, рабочий. Осталось написанный некрасивый код причесать и сделать - чтобы всё было в виде одного модуля. При подключении которого в конце секции USES - чтобы всё работало как раньше, как ни в чём не бывало.

Без перехвата WM_SETTEXT/WM_GETTEXT вполне можно обойтись - достаточно переопределить свойства Caption, Text у объектов - чтобы при обращении к свойству Text вызывался свой код, который уж как надо всё перекодирует.
7 апр 21, 16:51    [22305539]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Мимопроходящий,

Вы имеете ввиду - в вашем варианте вместо моего не придётся грузить копию компонента из dfm, а можно сразу поправить нужные свойства?
И присвоить правильные свойства можно будет ещё до того, как они будут испорчены с потерей информации?
7 апр 21, 16:56    [22305545]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207
Анна Петровна
Вы имеете ввиду - в вашем варианте вместо моего не придётся грузить копию компонента из dfm, а можно сразу поправить нужные свойства?
И присвоить правильные свойства можно будет ещё до того, как они будут испорчены с потерей информации?
да.
метод Loaded вызывается сразу после того, как все компоненты формы загрузили свои свойства из dfm-потока.
в этот момент вы можете их все скопом перекодировать по своему усмотрению.
7 апр 21, 17:01    [22305549]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
GunSmoker
Member

Откуда:
Сообщений: 3210
Текстовые свойства Delphi 7 хранит в Unicode. Т.е. тот же Caption у TButton читается таким методом:
function TReader.ReadWideString: WideString;
var
  L: Integer;
  Temp: UTF8String;
begin
  if NextValue in [vaString, vaLString] then
    Result := ReadString
  else
  begin
    L := 0;
    case ReadValue of
      vaWString:
        begin
          Read(L, SizeOf(Integer));
          SetLength(Result, L);
          Read(Pointer(Result)^, L * 2);
        end;
      vaUTF8String:
        begin
          Read(L, SizeOf(Integer));
          SetLength(Temp, L);
          Read(Pointer(Temp)^, L);
          Result := Utf8Decode(Temp);
        end;
    else
      PropValueError;
    end;
  end;
end;

Здесь проблем нет.

Далее, прочитанный WideString "Песик" конвертируется в AnsiString вызовом _LStrFromWStr / _LStrFromPWCharLen / CharFromWChar, что в итоге сводится к вызову:
Result := WideCharToMultiByte(DefaultUserCodePage, 0, WCharSource, SrcChars, CharDest, DestBytes, nil, nil);

где DefaultUserCodePage - глобальная переменная, по умолчанию равная 3 (CP_THREAD_ACP).

Т.е. WideString "Песик" корректно преобразуется в UTF-8 "Песик" (10 символов UTF-8).

Ну и в дальнейшем эта AnsiString будет передана в *A функции WinAPI, которые тоже корректно должны её опознать.

Так что не, что-то где-то другое косячит.
7 апр 21, 17:40    [22305574]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
Анна Петровна
Member

Откуда:
Сообщений: 68
Мимопроходящий,

Да, в Loaded можно перекодировать компоненты формы (кнопки и т. д.). Однако каким-то странным образом - в Loaded невозможен доступ к свойствам самой формы. И даже в OnCreate невозможно! То есть заголовок формы в OnCreate и в Loaded перекодировать не получится, а в Activate будет уже поздно. Можно, конечно, в случае GetACP=65001 просто тупо сделать заголовки всех форм пустыми. Но всё же интересно - почему в OnCreate и в Loaded нет доступа (даже на чтение) к свойствам самой формы.

Пример кода:

unit Unit1;
INTERFACE
USES Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
     procedure Loaded; override;
  end;
var
   Form1: TForm1;

IMPLEMENTATION
{$R *.dfm}

//реальное значение Visible: 1 (видимая)

procedure TForm1.FormCreate(Sender: TObject);
begin
   ShowMessage('FormCreate: '+inttostr(ord(self.Visible))); //0 - неправильное значение, должно быть 1
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
   ShowMessage('FormActivate: '+inttostr(ord(self.Visible))); //1 - правильное значение, но уже поздно, кодировка испорчена
end;

procedure TForm1.Loaded;
begin
   inherited Loaded;
   ShowMessage('Loaded: '+inttostr(ord(self.Visible))); //0 - неправильное значение, должно быть 1
end;

END.


Сообщение было отредактировано: 7 апр 21, 17:36
7 апр 21, 17:43    [22305580]     Ответить | Цитировать Сообщить модератору
 Re: Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод  [new]
GunSmoker
Member

Откуда:
Сообщений: 3210
Только что проверил: собрал в Delphi 7 приложение с Button1.Caption = "Песик" и запустил на Win10 c GetACP = UTF-8 - всё прекрасно показалось, как и ожидалось.
7 апр 21, 17:51    [22305590]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5 6 7   вперед  Ctrl      все
Все форумы / Delphi Ответить