Как напечатать символы c 128 по 255 кодировки ISO 8859-1?

Russian main discussion
Post Reply
  • Author
  • Message
Offline
Posts: 9
Joined: Sun Apr 26, 2015 9:30 am

Как напечатать символы c 128 по 255 кодировки ISO 8859-1?

Post by икс »

Друзья! Вот эта кодировка. Ни одной кириллической буквы. Так и нужно для задания.

Кодировку выбрать нетрудно. Сложнее выбрать шрифт с такими символами. Но я его нашёл, он у меня "Corel New", набор символов "Западные".

В AkelPad создаю файл, открываю в кодировке ISO 8859-1, устанавливаю шрифт "Corel New", "Западный". Перевожу клавиатуру на русский язык, печатаю и, поскольку русских букв в этой кодировке и в этом шрифте нет, будет печататься, что задано- символы с 128 по 255. Не все 128, клавиш-то меньше. Но кириллица точно не будет печататься.

...Кириллица и печатается. Никакого эффекта от перенастроек. Печатаются кирилические буквы так, как если бы настройки были:

кодировка 1251 (ANSI-кириллица)
шрифт "Corel New", "Кириллический"

ЧЯДНТ? Спасибо, кто откликнется. AkelPad 4.9.2

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

ЧЯДНТ?
Перевожу клавиатуру на русский язык, печатаю
Почитать вам про Юникод. Почитайте Хабровскую статью хотя бы.
Вы вводите code-point-ы кириллицы, они и отображаются. Кодировка - способ представления code-point-ов в байтах, когда их нужно сохранить вне среды обработки(в файле, или переслать в сеть). Считайте что внутри AP оперирует чистыми code-point-ами. Кодировка которую выставили будет использована только при сохранении.

Самый простой способ ввести те символы которые хотите - не поверите - скопировать их со статьи вики на которую ссылаетесь(если конечно там не на мухлевали).

Также можете воспользоваться плагином HexSel:
1. В редакторе вводите все коды(из кодировки 8859-1) которые вас интересуют, например x80x81x82x83x84x85 и т.да
2. Открываете панель плагина, открываете настройки
3. Direction Hex->Text, Single Byte - ISO-8859-1
4. Enclose, prefix: x, suffix оставляете пустым (как удобнее. это под пример выше)
5. Radix: hexadecimal
В окне редактирования выделяете введенные коды, и в окне плагина лицезреете искомые буквы. Копируете в окно редактирования, и сохраняете как хотите.
Вероятно сработает, но может и накосячить. Понять Юникод надо. Че за задание я хз, но явно что-то чего делать я бы не рекомендовал в реальной практике.

Offline
Posts: 9
Joined: Sun Apr 26, 2015 9:30 am

Post by икс »

До определённого момента всё проще. Итак, имеем оконную процедуру AkelPad, которая периодически вызывается. При нажатии на клавишу она вызывается и параметром wParam к ней попадает ASCII-код введённого символа. Упрощённый код на плюсах:

Code: Select all

LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  if (uMsg==WM_CHAR)
  {
	printf ("0X%x ", wParam);	
  }
Так, вот если мы включим английский регистр и будем нажимать на клавишу "s", то будем видеть в окне консоли "0x73", а если переключим на русский регистр, то при нажатии на "s" (теперь на "ы", поучается, ибо "s" и "ы" находятся на одной клавише) будем выдеть "0xFB"

Вот теперь оконная процедура (читай: программа) вольна сделать с полученым символом что угодно и может как угодно его интерпретировать.

Всё это все, естессно, знают. Это я просто напоминаю.

+++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++=

А теперь пошла сложность и непонятности из-за которой, собсно и был задан вопрос. Есть у меня предположения, что программа сейчас должна обработать этот самый символ "0xFB" в соответствии со своими настройками. А именно, заглянуть где там у ней спрятан шифр ("Corel New", "Западный"), найти в нём "0xFB" и отобразить этот символ (английское "u" с тильдой наверху) по нажатию клавиши

Но она так не делает. Впрочем, уверен, что делает, просто я не до конца разобрался с настройками, о чём и спрашиваю.

+++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++=

Что же касается юникода- знание чего бы то ни было никода не бывает лишним. В данном же вопросе не вижу, где ему можно найти применение, если не ставить себе целью щегольнуть им перед собеседником. Чего к вам не относится, естессно. За плагин спасибо. Вопрос открыт.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

икс
В AkelPad'е вывод текста идёт в Unicode, поэтому набор знаков в диалоге шрифтов не играет роли. Чтобы играл, перекомпилируйте программу с ANSI выводом.

Закомментируйте строки, как показано ниже, в файле AkelEdit.c:

Code: Select all

...
              else nLeftOffset=0;

              //if (!(to->dwPrintFlags & AEPRN_ANSI))
              //{
              //  TextOutW(to->hDC, rcTextOut.left + nLeftOffset, rcTextOut.top, wpText + i, nCharLen);
              //}
              //else
              {
                nBytes=WideCharToMultiByte(CP_ACP, 0, wpText + i, 1, szChar, sizeof(szChar), NULL, NULL);
                TextOutA(to->hDC, rcTextOut.left + nLeftOffset, rcTextOut.top, szChar, nBytes);
              }
              rcTextOut.left+=AE_GetCharWidth(ae, wpText + i, 0);
              i+=nCharLen - 1;
            }
          }
        }
        else
        {
          //if (!(to->dwPrintFlags & AEPRN_ANSI))
          //{
          //  ExtTextOutW(to->hDC, rcTextOut.left, rcTextOut.top, dwTextOutFlags, &rcTextOut, wpText, nTextLen, NULL);
          //}
          //else
          {
            nBytes=WideCharToMultiByte(CP_ACP, 0, wpText, nTextLen, NULL, 0, NULL, NULL);
...

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

В данном же вопросе не вижу, где ему можно найти применение,
Либо починить мозг тому кто придумал
Так и нужно для задания.
, либо что-бы поняли вы что пытаетесь использовать не тот инструмент.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Как насчёт того, чтобы в Control Panel -> Region and Language -> Administrative в качестве Current language for non-Unicode programs выставить German, к примеру?

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

DV, юникодные окна, всё приходит в wchar_t, в UTF-16, а та опция используется только в *A функция/сообщениях, и там где явно или не явно используется CP_ACP. Да и это не помогло бы, ибо преобразование W->A просто заменило входящие кириллические code-point-ы в заглушки для code-point которых нету в целевой кодировке.
Post Reply