powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывод в Memo японских иероглифов (932-я кодовая таблица)
25 сообщений из 70, страница 2 из 3
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39571345
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DunkinПри приведении PAnsiChar(TBytes) (оба типа managed, приводятся "на прямую") для строки будет выставлен размер TBytes?
Не будет:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  b: tbytes;
  s: ansistring;
begin
  try
    SetLength(b, 10);
    s := PAnsiChar(b);

Код: plaintext
1.
2.
3.
4.
encode.dpr.16: s := PAnsiChar(b);
0041C3D2 B8DC3E4200       mov eax,$00423edc
0041C3D7 8B15D83E4200     mov edx,[$00423ed8]
0041C3DD B900000000       mov ecx,$00000000
0041C3E2 E8D1A6FEFF        call @LStrFromPChar 

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure _LStrFromPChar(var Dest: AnsiString; Source: PAnsiChar; CodePage: Word);
{$IFDEF PUREPASCAL}
var
  Len: Integer;
  P: PAnsiChar;
begin
  Len := 0;
  if Source <> nil then
  begin
    P := Source;
    while P^ <> #0 do Inc(P);
    Len := P - Source;
  end;
  _LStrFromPCharLen(Dest, Source, Len, CodePage);
end;


Как видно из примера, Delphi просто копирует массив в строку до нахождения символа #0, а он в TBytes, в отличие от string , присутствовать не обязан. И, кстати, с каких пор PAnsiChar стал managed типом?..
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39571589
Dunkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,

Конечно я имел ввиду AnsiString. Просто опустил приведение AnsiString(PAnsiChar(TBytes))).
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39571837
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dunkinalekcvp,
Конечно я имел ввиду AnsiString. Просто опустил приведение AnsiString(PAnsiChar(TBytes))).
Ещё раз: конструкция AnsiString(PAnsiChar(TBytes))) может вернуть в строке мусор или Access Violation, потому что конструкция "PAnsiChar(TBytes)" будет читать данные из памяти, пока не встретит символ #0, а если его в буфере нет, то она продолжит чтение за границей буфера, а там может быть всё что угодно.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39572082
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Парни, спасибо всем за помощь и подсказки!
Но я пока еще не все изучил, предложенное Вами - время-времечка не на все еще хватает к сожалению!..(

Я видимо уже писал выше, что чтение и анализ идет побайтный... ну или пытался это выразить своей тестовой процедурой!...

В общем - кому интересно, можете взглянуть на практически полную процедуру в теме:
" Оптимизация побайтового чтения и сравнения двух бинарных файлов "
В ней видно побайтовое чтение, сравнение двух бинарных файлов и формирование выходного файла.

Ну никак я не могу понять - почему в текстовом редакторе " Notepad++ " или же в редакторе " WinHex " можно мгновенно изменить кодовую таблицу на любую из примерно сотни предложенных, а в простом " TMemo " для отображения японских 932 или 20932 -й - необходимо весь текст перекодировать в Unicode ?
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39572183
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

1. перекодировать никуда не нужно. нужно правильно отобразить уже закодированное когда-то, как я понимаю.
2. то, что легко и просто видно пользователю, как правило, требует тщательного и вдумчивого кодирования. и чем легче и проще работает тем, как правило, сложнее решение внутри.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39572185
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicНу никак я не могу понять - почему в текстовом редакторе " Notepad++ " или же в редакторе " WinHex " можно мгновенно изменить кодовую таблицу на любую из примерно сотни предложенных, а в простом " TMemo " для отображения японских 932 или 20932 -й - необходимо весь текст перекодировать в Unicode ?

ээээ? Вообще-то Notepad++ отображает текст именно в Unicode и никак иначе. Времена двойного ANSI давно прошли, сумасшедших больше нет.

Грубо говоря, ты:
Код: sql
1.
2.
3.
4.
5.
6.
7.
var
  S: RawByteString;
begin
  // загрузили в S
  SetCodePage(S, 932, False);
  Memo1.Text := String(S);
end;



Notepad++:
Код: sql
1.
2.
3.
4.
5.
6.
7.
var
  S: RawByteString;
begin
  // загрузили в S
  SetCodePage(S, что-ты-выбрал-в-меню, False);
  Memo1.Text := String(S);
end;
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39583976
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Парни, подскажите плизз - что делаю не так?
...
Отказался от использования MEMO, вывожу ZColorStringGrid (наследован от TStringGrid)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var
JPN: RawByteString;
ISimvol, ISimvol_2 : Byte;

//==== МультиСимвол =============================
ISimvol := Byte(AdrByte^); // Читаем 1-й байт ДвухБайтового символа
// Объединяем текущ. и Cлед. ячейку, потому что иероглифы шире
MergeCells.AddRectXY(ColX+16, RowY, ColX+16+1, RowY);

ISimvol_2 := Byte((AdrByte+1)^); // Читаем 2-й байт ДвухБайтового символа
JPN := AnsiChar(ISimvol) + AnsiChar(ISimvol_2); // Соединяем Два байта
SetCodePage(JPN, 932,False); // указываем кодировку В ОТЛАДЧИКЕ ВИЖУ ИЕРОГЛИФ!

// Выводим 2-х байтовый иероглиф в поле Символ
Cells[ColX+16, RowY] := string(JPN);


В результате в ячейке не вижу Иероглифа!
Подскажите плизз - что не так делаю?..(
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39583977
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic, шрифты проверь.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39583980
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Примерно такой же код был с использованием Мемо:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
for j := 0 to 5 do
                              begin
                                   AddressRichEdit.Lines.Add(IntToHex(Integer(AddTab) + j*16, 8));
                                   SStroka := '';
                                   JPN := '';
                                   for i := 0 to 15 do  // ПОМЕНЯТЬ ИМЯ ПЕРЕМЕННОЙ!!!!!!
                                        begin
                                             //ISimvol := Byte(PByte(Integer(AddTab) + i + j*16)^);
                                             //AdrByte := PByte(Integer(AddTab) + Integer(AddToOffset) + i + j*16);
                                             AdrByte := PByte(AddTab + Integer(AddToOffset) + i + j*16);
                                             //if AdrByte=P then PStart := i;
                                             //Long1 := 16 - i
                                             ISimvol := Byte(AdrByte^);
                                             SStroka := SStroka + IntToHex(ISimvol, 2);
                                             if i < 15 then
                                                  SStroka := SStroka + ' ';
                                             if (ISimvol in [0..31, 127]) then ISimvol := 32; // SPASE
                                             JPN := JPN + AnsiChar(ISimvol);
                                        end;
                                   HexRichEdit.Lines.Add(SStroka);
                                   SetCodePage(JPN, 932,False); // указываем кодировку исходных данных
                                   CharRichEdit.Lines.Add(string(JPN)); // тут дельфи неявно перекодирует JPN в юникод
                              end;


Там все показывало нормально - правильные Иероглифы!
Но Символьная часть расползалась ввиду того, что Иероглифы имеют большую длину, чем обычные символы.
Посему от Мэмо отказался в пользу СтринГрида...

Шрифт в Мэмо кстати был Courier, как и сейчас в ZColorStingGrid
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39583985
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GunSmokerBellic, шрифты проверь.
Попробовал с Тахомой - одно и то же!..(
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39583986
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пардон, совсем забыл, что после Мэмо был вариант с RichEdit ..))
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39583988
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На всякий случай включил SizingHeight и SizingWidth, но и это не помогло - в место Иероглифа - точка посередине ячейки!
(увеличивать длину и высоту ячейки, если текст не помещается)
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584230
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GunSmokerBellic, шрифты проверь.
Все порешал! - Была досадная накладка в алгоритме..((
Шрифты тут были не при чем!

P.S. Кстати - нашел отличный ресурс по кодовым таблицам с таблицами самих символов.
Оказалось, что CP932 и Shift-JIS несколько отличаются друг от друга!

А сейчас разыскиваю 20932 -ю таблицу с символами, но возможно лучше создать новую тему?
GunSmoker , может пообщаемся?))
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584487
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе обязательно Memo ??? Есть редактор - TBCEditorDemo

https://github.com/bonecode

Архив приложу, который сразу всё включает. Правда там всё собиралось для Токио (Была правка мною omnixml)
https://drive.google.com/open?id=1Pmu7KMHELtoZ2vWEVFHYVwPSelxH5whs

Собранный мною exe
https://drive.google.com/open?id=156vgkDFe-znajHsRDdCIwGJRiqmQcdXR

Скрин
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584531
NetObserver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,
там написано

Build requirements

Delphi XE4 or higher
C++ Builder XE6 or higher


А топикастера XE3!
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584555
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NetObserverНяшик,
там написано

Build requirements

Delphi XE4 or higher
C++ Builder XE6 or higher


А топикастера XE3!

Там по любому правки в пару строках, и всё соберётся. Сколько раз собирал проекты с D2006-D7 на токио. Значит и в обратную лунку зайдёт хорошо
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584578
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, у меня кроме ХЕ3 и Токио имеется!)))
Вечерком гляну и отпишусь...
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584608
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicНяшик, у меня кроме ХЕ3 и Токио имеется!)))
Вечерком гляну и отпишусь...

Рекомендации по установки моего архива (Допустим распакованным в D:\bonecode)


Сначала указываем в глобальных путях все исходники

Начинаем установку по порядку

D:\bonecode\Virtual-TreeView-master\Packages\RAD Studio 10.2\VirtualTreeView.groupproj


D:\bonecode\Components-master\BCComponents\Packages\BCComponents.Delphi.Berlin.groupproj


D:\bonecode\Components-master\BCControls\Packages\BCControls.Delphi.Berlin.groupproj


(Просто билдим)
D:\bonecode\Common-master\Packages\BCCommon.Delphi.Berlin.Runtime.dproj (Будет 100% требовать omnixml)

(Теперь устанавливаем редактор (Проект для берлина легко ставится на Токио))
D:\bonecode\TBCEditor-85efbcfb9b90f64220d135dcdf89282849a6c3b7\Packages\BCEditor.Delphi.Berlin.groupproj

(Открываем тестовый пример)
D:\bonecode\Demos\Simple\TBCEditorDemo.dproj


...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584613
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, по пути D:\bonecode\Common-master\Source\BCCommon.Encoding.pas

Есть готовая процедура, для смены кодировки на лету

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure SetEncoding(AEditor: TBCEditor; Value: Integer);
begin
  if Assigned(AEditor) then
  with AEditor do
  case Value of
    ENCODING_ANSI:
      Encoding := TEncoding.ANSI;
    ENCODING_ASCII:
      Encoding := TEncoding.ASCII;
    ENCODING_BIG_ENDIAN_UNICODE:
      Encoding := TEncoding.BigEndianUnicode;
    ENCODING_UNICODE:
      Encoding := TEncoding.Unicode;
    ENCODING_UTF7:
      Encoding := TEncoding.UTF7;
    ENCODING_UTF8:
      Encoding := TEncoding.UTF8;
    ENCODING_UTF8_WITHOUT_BOM:
      Encoding := TEncoding.UTF8WithoutBOM;
  end;
end;
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584714
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, глянул я Экзешник и процедуру перекодировки...
Мне нужно совсем другое!
...
По простому говоря: имеем побайтовое чтение файла, имеем японскую кодировку ( Shift-JS , CP932 или 20932 ).
В процедуре в зависимости от выбранной кодировки нужно определить - сколько байт имеет очередной символ? После этого данное количество собирается в RawByteString , например так:
Код: pascal
1.
JPN := AnsiChar(ISimvol) + AnsiChar(ISimvol_2); // Соединяем Два байта


затем:
Код: pascal
1.
SetCodePage(JPN, 932,False); // указываем кодировку


и пишем это в ячейку ZColorStringGrid
В результате в данной ячейке будет корректно отображен японский иероглиф (двухбайтный в примере)...
...
В чем сейчас у меня проблема?
А в том, что для Shift-JS и CP932 я могу выделить Множества или Диапазоны на основе вот этих реальных таблиц:
- http://www.kreativekorp.com/charset/encoding.php?name=Shift-JIS
- http://www.kreativekorp.com/charset/encoding.php?name=CP932
И соответственно могу построить алгоритм расчета - сколько байт занимает очередной японский символ - 1 или 2!

А вот для 20932 - аналогичной таблицы не нашел в Интернете - а в этой кодировке есть 1, 2 и 3-х байтные символы.

ЗЫ: Сначало собирал в строку, если помните и выводил в Мемо, но строки иногда расползались, в результате - выбрал компоненту ZColorStringGrid , где для каждого символа или иероглифа можно выделить одну ячейку и ничего не расползается!
Еще понравилось, что можно объединять ячейки и раскрашивать (шрифт и фон) и т.д.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584726
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем делать такой мазохизм ??? Сразу сделать одну кодировку - UTF8 и всё.

Кстати, по стандарту все твои иероглифы поддерживаются в Memo решил проверить




Всё верно. 36 * 2 = 72 в UTF-8
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584732
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, ты не внимательно читаешь - я два раза повторил...
Вот тебе скриншот прикладываю...
Верхние три поля - это Мемо , нижнее - StringGrid
Надеюсь видно что в верхнем Правом Мемо все расползается из-за наличия там Иероглифов?
По этой причине и по другим - пересел на ZColorStringGrid!
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584760
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

https://github.com/bonecode/BCHexEditor

Это HEX редактор
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584768
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, а теперь смени кодировку в Символьной колонке!?
Поставь 932.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584845
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, а еще - мне режим редактирования не нужен!
Только просмотр некоторой области вокруг определенной последовательности байт, с ее подсветкой, объединение ячеек, цвет шрифта отдельных ячеек.
Мой код - десяток строк, а Компонент по любому тяжелее будет!
Но за ссылку - Спасибо!
Обязательно погляжу!
...
Рейтинг: 0 / 0
25 сообщений из 70, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывод в Memo японских иероглифов (932-я кодовая таблица)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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