powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывод в Memo японских иероглифов (932-я кодовая таблица)
70 сообщений из 70, показаны все 3 страниц
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570653
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с проблемой вывода в Memo японских иероглифов.

Имеем японскую фразу " こんにちは " (по русски - " Добрый день ").
К сожалению форум не позволил мне вывести эти символы, поэтому вывожу графику:

В кодовой таблице " SHIFTJIS " ( 932 ) это будет " 82B182F182C982BF82CD " (Hex).

На Форме находятся кнопка " Button " и " Memo ", в свойствах шрифта которого выбрана Charset=" SHIFTJIS_CHARSET ".
Процедура обработки нажатия кнопки:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
//==============================================================================
procedure TMainForm.ButtonClick(Sender: TObject);
var
i: Integer;
const
Bytes: array[0..9] of byte = ($82, $B1, $82, $F1, $82, $C9, $82, $BF, $82, $CD);
begin
     Memo.Lines.Add('"Добрый день" по японски: "');
     for i := 0 to 9 do
          begin
               Memo.Lines[Memo.Lines.Count-1]:=
                    Memo.Lines[Memo.Lines.Count-1] + AnsiChar(Bytes[i]);
          end;
     Memo.Lines[Memo.Lines.Count-1]:=
          Memo.Lines[Memo.Lines.Count-1] + '"';
end;
//==============================================================================


На выходе имеем вот такой результат:



Подскажите плизз - как решить задачку?

P . S . И еще попутный вопрос - как добавить в Дэлфи кодовую таблицу 20932 ?
(Что бы ее можно было для выбрать в свойстве Font.Charset для Memo !)
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570654
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

всё замечательно расписано, кроме главных вводных: версия среды и версия операционки.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570655
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonBellic,
всё замечательно расписано, кроме главных вводных: версия среды и версия операционки.
Пардон, еще же подумал, что надо бы сделать!..))

- Windows 7 6.1 (Build 7601: Service Pack 1), 32-bit, включена поддержка Японского языка.
- Delphi® XE3 Version 17.0.4625.53395.

P . S . я понял так, что свое сообщение я уже не могу подправить после опубликования?
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570657
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без unicode-строки текст в TMemo для указанного примера в любом случае будет искажен - неправильно будут отображаться либо русские символы, либо японские. Соответственно коды букв должны быть 2х байтные (Word), а не Byte
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570659
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asutp2Без unicode-строки текст в TMemo для указанного примера в любом случае будет искажен - неправильно будут отображаться либо русские символы, либо японские. Соответственно коды букв должны быть 2х байтные (Word), а не Byte
Дело в том что приведенный пример кода максимально приближен к Реальному проекту , а в нем идет побайтовое чтение из реального файла и вывод в Memo !
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570662
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще одна проблема - при чтении из файла среди "двухбайтовых" иероглифов могут встретиться "однобайтные" английские символы!
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570664
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

так не получится. нужно собрать нормальную юникодовую строку и затем её добавлять в memo.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570665
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант - прочитать сразу как строку. смысл файл читать побайтно?
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570666
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

операционной системе фиолетово, как хранятся символы у тебя в файлах, и твой же пример этот факт демонстрируется во всей красе :)

Для решения проблемы используй unicode-строки, без уникода русские и японские символы одновременно в ansi отображаться не будут. исходные файлы нужно предварительно преобразовывать.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570667
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonкак вариант - прочитать сразу как строку. смысл файл читать побайтно?
Я подумаю над этим, но ввиду необходимости вылавливания Упр.Символов в строке (А они там порой попадаются) - приходится читать побайтно!
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570670
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asutp2Bellic,
Для решения проблемы используй unicode-строки, без уникода русские и японские символы одновременно в ansi отображаться не будут.
А Русских символов в файлах вообще нет!
Там Английские и Японские! + Упр.Символы
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570672
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

без разницы, хоть китайские . управляющие символы можно вполне зафильтровать в строке.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570675
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonBellic,
без разницы, хоть китайские . управляющие символы можно вполне зафильтровать в строке.
Есть ли вариант - доработать указанный выше код, что бы увидеть Иероглифы?
я еще слабо разбираюсь в Юникоде!
Можете реально код подправленный привести?
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570677
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

например так:

Код: pascal
1.
Memo.Lines.LoadFromFile('1.txt', TEncoding.UTF8);


Если данные сохранить в файл в utf8. Если кодировка другая - то поменяй на нужную.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570680
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
судя по этому:

авторпри чтении из файла среди "двухбайтовых" иероглифов могут встретиться "однобайтные" английские символы!

у тебя utf8 скорее всего.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570681
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonBellic,
например так:
Код: pascal
1.
Memo.Lines.LoadFromFile('1.txt', TEncoding.UTF8);


Если данные сохранить в файл в utf8. Если кодировка другая - то поменяй на нужную.
Исходный файл - вообще не Текстовый!
Это двоичный файл прошивки для CPU в котором встречаются текстовые блоки на Английском, Японском и смешанном - ENG+JPN.
Поэтому преобразовать его не получится!
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570682
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, общая идея такая:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  j: RawByteString; // этот тип не зависит от дефолтной кодировки OS
const
  Bytes: array[0..9] of byte = ($82, $B1, $82, $F1, $82, $C9, $82, $BF, $82, $CD);
begin
     Memo.Lines.Add('"Добрый день" по японски: "');
     for i := 0 to 9 do
          begin
            j := j + AnsiChar(Bytes[i]);
          end;
     SetCodePage(j, 932, False); // указываем кодировку исходных данных
     Memo.Lines[Memo.Lines.Count-1]:=
       Memo.Lines[Memo.Lines.Count-1] + string(j); // тут дельфи неявно перекодирует j в юникод 
     Memo.Lines[Memo.Lines.Count-1]:=
          Memo.Lines[Memo.Lines.Count-1] + '"';
end;


Но имей в виду, что за конструкции типа "j := j + AnsiChar(Bytes[i]);" в цикле надо бить палками, потому что это дико неэффективно, как по скорости, так и по выделению памяти. Так что этот говнокод - только для примера решения твоей проблемы.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570683
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл добавить
Код: pascal
1.
j := '';

в самом начале процедуры, редактировать нельзя :(
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570685
либо так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Либо таким методом, через TEncoding. Причем ты можешь обоими методами перекодировать и английские символы.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
b: TEncoding;
t: TBytes;
const
Bytes: array[0..9] of byte = ($82, $B1, $82, $F1, $82, $C9, $82, $BF, $82, $CD);
begin
     Memo1.Lines.Add('"Добрый день" по японски: "');
     b:= TEncoding.GetEncoding(932);
     SetLength(t, Length(Bytes));
     Move(Bytes[0], t[0], Length(Bytes));
     Memo1.Lines[Memo1.Lines.Count-1]:=
                    Memo1.Lines[Memo1.Lines.Count-1] + b.GetString(t);
     Memo1.Lines[Memo1.Lines.Count-1]:=
          Memo1.Lines[Memo1.Lines.Count-1] + '"';
end;
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570688
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое! - По разбираюсь пока с Кодами..)
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570704
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Второй вариант мне больше понравился!
Попробовал вариант с текстом ENG + JPN :
Код: pascal
1.
2.
Bytes: array[0..24] of Byte = ($4C,$41,$4E,$90,$DA,$91,$B1,$8B,$40,$8A,$ED,$83,
     $6F,$81,$5B,$83,$57,$83,$87,$83,$93,$8F,$EE,$95,$F1);


Класс!!!

Осталось решить - как при выводе на лету заменить внутри байт $ 0A на $ 40 (символ ' @ '), если таковой встретится!?
Например если:
Код: pascal
1.
2.
Bytes: array[0..25] of Byte = ($4C,$41,$4E,$0A,$90,$DA,$91,$B1,$8B,$40,$8A,$ED,$83,
     $6F,$81,$5B,$83,$57,$83,$87,$83,$93,$8F,$EE,$95,$F1);
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570731
Dunkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё вариант:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
type
  JapanString = type AnsiString(932);

procedure TForm1.ButtonClick(Sender: TObject);
var
  i: Integer;
  j: JapanString;
const
  Bytes: array[0..9] of byte = ($82, $B1, $82, $F1, $82, $C9, $82, $BF, $82, $CD);
begin
  Memo.Clear;
  Memo.Lines.Add('"Добрый день" по японски: "');
  j := PAnsiChar(@Bytes[0]);
  Memo.Lines[Memo.Lines.Count-1]:=
    Memo.Lines[Memo.Lines.Count-1] + string(j);
  Memo.Lines[Memo.Lines.Count-1]:=
    Memo.Lines[Memo.Lines.Count-1] + '"';
end;


Во втором варианте утечка памяти - все TEncoding с нестандартными кодировками нужно прибивать.

StringReplace для замены "на лету", но лучше не "на лету".
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570770
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DunkinЕщё вариант:
Код: pascal
1.
2.
3.
4.
5.
6.
const
  Bytes: array[0..9] of byte = ($82, $B1, $82, $F1, $82, $C9, $82, $BF, $82, $CD);
begin
.....
  j := PAnsiChar(@Bytes[0]);
.....



Так, как исходный массив не заканчивается на $00, то эта конструкция будет работать только пока память после него случайно забита нулями. Как только там появятся какие-то другие значения - в тексте будет мусор и может случиться AV.
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39570788
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicDelphi® XE3 Version 17.0.4625.53395

Delphi 2009 и выше (т.е. в т.ч. и Delphi XE3) относятся к Unicode IDE. Это означает, что любые текстовые данные для вывода должны быть представлены в Unicode (UTF-16). Если ваши текстовые данные находятся в другом формате - их нужно предварительно преобразовать.

Bellicв свойствах шрифта которого выбрана Charset="SHIFTJIS_CHARSET"

Не нужно это делать. В Unicode вы не работаете с кодовыми страницами.

BellicИ еще попутный вопрос - как добавить в Дэлфи кодовую таблицу 20932?

Кодовая страница 20932 является частью Unicode. Она уже есть и используется. Не нужно её выбирать. И, кстати, по-моему, у вас данные - в 932, не в 20932.

Bellicв нем идет побайтовое чтение из реального файла

Читайте в RawByteString:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var 
  JS: RawByteString; // 932
  S: String; // UTF-16
begin
  SetLength(JS, ваша_длина);
  SetCodePage(JS, 932, False); // укажем, что в JS будут данные в кодировке 932
  читаете_в_JS; // Move, ReadBuffer, ReadFile и т.д., например: Move(Bytes[0], Pointer(JS)^, Length(Bytes));
  S := String(S); // необязательно, только для удобства отладки
  Memo1.Text := S;
end;



Или, если кодировка фиксирована, то можно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
type
  String932 = AnsiString(932);
var 
  JS: String932; // 932
begin
  SetLength(JS, ваша_длина);
  читаете_в_JS;
  Memo1.Text := String(S);
end;



Можно и через TEncoding, то смысла большого нет, больно громоздко для вашей задачи.

BellicК сожалению форум не позволил мне вывести эти символы

И ровно так же может случиться и в Delphi приложении. Чтобы пользователь успешно увидел правильный текст, нужно два компонента:
- Текст должен быть представлен без потерь в подходящей для вывода кодировке - это мы сделали выше
- В используемом шрифте должны быть отрисованы иероглифы, а не заглушки

По шрифтам больше информации - тут: http://www.transl-gunsmoker.ru/2009/05/blog-post_3589.html

Кратко:
- Если у вас выбран шрифт по умолчанию (Tahoma), то система сама выберет подходящий шрифт (если он вообще есть в системе) - т.н. "Font Fallback".
- Для старых систем лучше таскать шрифт с собой, поскольку в системе он может быть не установлен. Например, Arial Unicode MS.

BellicОсталось решить - как при выводе на лету заменить внутри байт $0A на $40(символ '@'), если таковой встретится!?

Управляющие символы преобразуются без изменений. Просто сконвертируйте в String и сделайте StringReplace (ну или циклом for).
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39571130
Dunkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,

Пф-ф. ТС наверняка в состоянии написать через Move. В реальной жизни вряд ли будет через статический массив.

При приведении PAnsiChar(TBytes) (оба типа managed, приводятся "на прямую") для строки будет выставлен размер TBytes?
...
Рейтинг: 0 / 0
Вывод в 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
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584865
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, подскажи плизз - как установить этот компонент (BCHexEditor)?
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584926
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicНадеюсь видно что в верхнем Правом Мемо все расползается из-за наличия там Иероглифов?
А если поставить моноширный шрифт, типа Courier New?..
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584927
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp, Не хочу обратно возвращаться к Мэмо!
Пробовал вроде по разному - Иероглифы размер больше имеют!
Да и у СтринГрида другие "плюсики" имеются..)))
я кстати запихиваю иероглиф в две объединенные ячейки - получается почти как в ВинКексе!
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584959
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Открой \Packages\BCHexEditor.Package.Runtime.dproj

Переключи битность приложения в 32 бит
Удали {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}

Нажми ctrl + s и билди

Открой \Packages\BCHexEditor.Package.Designtime.dproj
Билди и установи (Будет что - то орать при установки, закрой среду полностью. Попытайся открыть ) BCHexEditor.Package.Designtime.dpk и его установи.


Дальше открываешь демку. Ставишь галку ReadOnlyView и больше пользователь не может редактировать.

Снизу можно включить отображение юникода ... Можно включить отображение грида, и прочие настройки
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584970
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
Где такое удалять?
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39584983
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел где удалить {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
Все сделал как ты описал - но компонента не появилась!..((
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39585057
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дэк компоненты надо установить install

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

...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39585070
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, уже что только не делал!
Не получается!
И ДизайнПак и РанПак открывал и компилил..
ПЕрвый вроде говорит что все ок.. а второй - BCHexEditor.Package.Runtime.pas не могу установит - этого файла нету!
Как то вся установка через Ж!
Это твой труд? - Может по человечьи сделаешь?
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39585073
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, пока я дома - может ТаймВьюером зайдешь и настроишь сам?
852 355 362 7450
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39585075
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПАрдон - лучше дай Мыло - вышлю пароль!.))))
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39585077
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читать бы тебе научится

Няшик(Будет что - то орать при установки, закрой среду полностью. Попытайся открыть BCHexEditor.Package.Designtime.dpk и его установи.)

Я эти компоненты установил за минуту (со скачиванием)
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39585091
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, возможно...
Пишет что проект уже содержит Юнит и Форму...
Давай ТаймВьюером? Делов то 2 минуты, если верить тебе!?))))
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39585094
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, я свой ящик в своем профиле засветил.. пиши туда..
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39585115
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, установил я... поискал BPL-файлы и засунул куда нужно!,,))
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39585119
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я понял, что описания никакого нету к этим компонентам?
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39585125
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне легче gif записать

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

Да оно особо и не нужно. Там всё интуитивно понятно. Хотя если возникают трудности с установкой... То это наверно у меня нет проблем
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39596679
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, а какой прогой пользуешься для записи в GIF ?
...
Рейтинг: 0 / 0
Вывод в Memo японских иероглифов (932-я кодовая таблица)
    #39596858
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

пользуй ScreenToGif
...
Рейтинг: 0 / 0
70 сообщений из 70, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывод в Memo японских иероглифов (932-я кодовая таблица)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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