powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
25 сообщений из 175, страница 2 из 7
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060360
Fr0sT-Brutal,

Так нужны ведь. Мне например, нужны. И вообще есть горы софта, которые работают без поддержки Юникода. Переписывание софта или переход на другие версии с поддержкой УТФ это в любом случае новые баги, недовольства пользователей и прочее. Не говоря про то, что есть куча старого софта, который заброшен и который вообще некому переписывать.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060362
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот старый софт не пытается говорить по-русски с французами.

Серьёзно повторяю предложение задействовать TNT Unicode Controls и не парить моск.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060367
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
avp_
Fr0sT-Brutal
ACP должны умереть.

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

К тому, что это гемор и пережиток темного прошлого. Аналоговое ТВ сдохло, и кодовые страницы должны сдохнуть тоже.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060375
Dimitry Sibiryakov,

Так TNT надо было использовать с самого начала а в идеале и писать на Delphi 2010 сначала, а не на 7 ... А теперь нереально на него переписать десятки тысяч строк кода ...
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060376
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на ТНТ перейти гораздо проще, чем на новые версии Delphi.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060377
Fr0sT-Brutal,

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

Но всё равно буду готовить софт к переходу на Delphi 2010 (он юникодный, с него вероятно будет проще перейти на Delphi XE10 в дальнейшем). Delphi 7 рано или поздно умрёт, наверное лучше переходить на D2010, чем на TntComponents (скорее всего и то и то потребует сопоставимо усилий).
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060378
Мимопроходящий,

а что делать со старым кодом, который работает с кучей Edits, Grids, DBGrids итд?
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060380
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Петровнаа что делать со старым кодом, который работает с кучей Edits, Grids, DBGrids итд?

Назвать новые контролы так же как старые, чтобы имеющийся код ничего не заметил?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060393
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы для начала выяснил причину кракозябров в D7. На каком конкретно шаге "не так". Может, там просто всё решается.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060399
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Петровна
...
А в Delphi 2010 - проблема такая, что модули VCL идут вообще без исходного кода. Так что непонятно как их модифицировать чтобы сохранить все хаки,сделанные в Delphi 7.
Это какая-то неправильная Delphi 2010 у вас. Исходники VCL в обычной Pro версии есть, как и в более поздних.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060403
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут, по-моему, выход только один: на текущий момент предлагать пользователю отключать эту настройку, которая мешает работать программе, и параллельно начать писать новую версию программы без быдлокода и на современной версии (возможно даже не дельфи, но это по желанию). Иначе в один далеко не прекрасный момент вы столкнётесь с чем-то, что уже не сможете обойти и выхода у вас не будет.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060408
Кстати, помогло создание обёрток в виде, представленном ниже. Это работает с 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 в верной кодировке ...
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060417
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Петровна

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

Тупо переделать всё на программную инициализацию не предлагать?..
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060418
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Петровна,

Перехватывать WM_SETTEXT/WM_GETTEXT.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060426
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анна Петровна
Главная проблема с Edits - всё работает нормально (даже без обёрток) - если работать с ними с помощью программного кода. Если же стартовое значение Edit было присвоено в свойствах формы (dfm) - в этом случае загружаются крякозябры и расшифровать их уже невозможно. Ч так понимаю, что-то нужно делать в методе

F.ReadComponent(Self)

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

Самый простой и топорный способ - позаменять во всех dfm TEdit => TUtf8Edit. Ну и TUtf8Edit полноценно зарегистрировать в среде как компонент
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060432
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GunSmoker
Я бы для начала выяснил причину кракозябров в D7. На каком конкретно шаге "не так". Может, там просто всё решается.

Так наверняка при описанном режиме *A функции перегоняются в *W предполагая, что на входе utf8. Конечно, когда там на самом деле 1251, получается лажа.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060437
alekcvp,

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

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

В этом случае получается то же самое - как и в случае программной реализации. Присваиваем значения точно также программно - только считывая их из копии DFM.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060443
Fr0sT-Brutal,

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

Поэтому - либо значения Edits не хранить в dfm - либо грузить копию dfm при создании формы - перекодируя как нужно в UTF-8.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060444
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Петровна
Походу - решается вопрос без перехода на программную реализацию (перейти нереально - там десятки тысяч строк кода).

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

В этом случае получается то же самое - как и в случае программной реализации. Присваиваем значения точно также программно - только считывая их из копии DFM.
можно создать компонент, который будет этим заниматься.
Примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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;
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060447
Мимопроходящий,

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

Без перехвата WM_SETTEXT/WM_GETTEXT вполне можно обойтись - достаточно переопределить свойства Caption, Text у объектов - чтобы при обращении к свойству Text вызывался свой код, который уж как надо всё перекодирует.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060451
Мимопроходящий,

Вы имеете ввиду - в вашем варианте вместо моего не придётся грузить копию компонента из dfm, а можно сразу поправить нужные свойства?
И присвоить правильные свойства можно будет ещё до того, как они будут испорчены с потерей информации?
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060454
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Петровна
Вы имеете ввиду - в вашем варианте вместо моего не придётся грузить копию компонента из dfm, а можно сразу поправить нужные свойства?
И присвоить правильные свойства можно будет ещё до того, как они будут испорчены с потерей информации?
да.
метод Loaded вызывается сразу после того, как все компоненты формы загрузили свои свойства из dfm-потока.
в этот момент вы можете их все скопом перекодировать по своему усмотрению.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060466
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Текстовые свойства Delphi 7 хранит в Unicode. Т.е. тот же Caption у TButton читается таким методом:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
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, что в итоге сводится к вызову:
Код: pascal
1.
Result := WideCharToMultiByte(DefaultUserCodePage, 0, WCharSource, SrcChars, CharDest, DestBytes, nil, nil);


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

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

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

Так что не, что-то где-то другое косячит.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060471
Мимопроходящий,

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

Пример кода:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
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.
...
Рейтинг: 0 / 0
Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
    #40060475
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только что проверил: собрал в Delphi 7 приложение с Button1.Caption = "Песик" и запустил на Win10 c GetACP = UTF-8 - всё прекрасно показалось, как и ожидалось.
...
Рейтинг: 0 / 0
25 сообщений из 175, страница 2 из 7
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Крякозябры вместо русских символов на Windows 10 - при включенной опции Юникод
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]