Як MS-DOS та інші текстові програми можуть відображати символи CJK подвійної ширини?


9

Я бачив багато екранів налаштування BIOS для текстового режиму японською та китайською мовами. Останнім часом я навіть бачив налаштування Windows XP японською мовою. У MS-DOS були і японські версії. Реальний режим DOS , а не командний рядок Windows!

Налаштування японської BIOS

Японський MS-DOS 6.2

Один типовий екран текстового режиму має розмір 80x25 . Якщо японський символ займає стільки ж, скільки подвійна нормальна ширина латинських символів, максимальна кількість японських символів, які можна одночасно відображати на екрані, становить близько 1000. Тож нам потрібно 2000 кодових точок для відображення лівої та правої частини символів.

Як текстовий режим за замовчуванням може відображатися лише 256 символів, але перші 128 використовуються для ASCII, тому корисні для них обмежені високими 128 кодовими точками. Якщо потрібно, ми можемо розширити його до 512, але це все ще не може підтримувати достатньо точок коду для відображення. Мені завжди цікаво, як їм вдалося відобразити великий набір символів з такою обмеженою кількістю символів.

[ Японський інсталятор XP] 8]

Текстовий режим в Linux, здається, використовує драйвер графічного режиму, оскільки він може відображати Unicode і має набагато більше кольорів. Але я не можу пояснити, як вони це роблять на екранах налаштування MS-DOS та BIOS.


EDIT: Я навіть знайшов японський текст для DOS

Японський ІМЕ

У текстовому режимі є також корейська!

Корейська

VMWare корейський DOS


Ви, мабуть, не дивитесь на японських "символів", тобто канджі , а скоріше хірагану чи катакана , які мають відображення Unicode.
тирса

@sawdust: подивіться на малюнок вище, і ви побачите, що на ньому можуть відображатися не лише всі кана, але й
кандзи

1
Зауважте, що на сторінці, на яку ви, швидше за все, було зроблено скріншот програми встановлення OS / 2, написано поруч із скріншотом, що "підтримка графічного текстового режиму була ініціалізована майже негайно під час завантаження OS / 2". Графічне ключове слово .
CVn

@ MichaelKjörling це вміння мають не лише ОС / 2, але й програми налаштування MS-DOS та BIOS - і в текстовому режимі
phuclv

Відповіді:


6

Нормальний режим "80x25 символів" - це фактично 720x350 пікселів (тобто кожна комірка символів має 9 пікселів, ширина - 14 пікселів). Режими символів подвійної ширини ("40x25") можуть або просто інтерполювати це на більшу ширину, подвоюючи кожен стовпець для економії пам’яті відеоконтенту (розрізавши необхідну кількість пам'яті відеоконтенту навпіл), або використати додаткову пам’ять із гліфів та ідентичну обсяг пам'яті відеоконтенту для збільшення символьних комірок до 18 * 14 пікселів.

Досить рано (я думаю, що це було зроблено, коли було введено EGA ), до режиму відображення тексту IBM PC була додана підтримка визначених користувачем гліфів.

Звичайний текстовий режим IBM PC - це просто послідовний 4000 байт оперативної пам'яті відеоконтенту за певною адресою. Вони читаються як один байт атрибутів символів (спочатку блимає, жирний, підкреслює тощо; пізніше повторно використовується для кольорів переднього плану та фону та блимає / виділяє, отже, обмеження на 16 кольорів у текстовому режимі) та одного байта, що описує символ на відображатись. Фактичний гліф, який відображатиметься для кожного значення байтів символів, зберігається в іншому місці.

Це означає, що якщо ви можете зробити з 256 чітко виражених гліфів на екрані в будь-який час, і кожен гліф може бути представлений у вигляді бітової карти 9x14, ви можете просто замінити гліфи в пам'яті, щоб символи відображалися по-різному . Частково це була одна частина того, що було mode con codepage selectзроблено на DOS. Це порівняно тривіально.

Якщо вам потрібно більше 256 чітко виражених гліфів, але ви можете жити зі зменшеною кількістю гліфів на екрані, ви можете перейти за схемою 40x25 з гліфами подвійної ширини (18 пікселів). Якщо припустити, що загальна кількість оперативної пам'яті відеоконтенту є фіксованою та припускаючи, що ви можете збільшити бітову карту пам'яті гліфа, ви можете перейти до використання двох байтів з кожні чотири байти, щоб представити один екранний гліф, надаючи вам доступ до 2 ^ 16 = 65 536 різних гліфів (включаючи порожній гліф). Якщо ви відчуваєте сміливість, ви можете навіть пропустити другий байт атрибута, який дає вам доступ до 2 ^ 24 ~ 16,7М різних гліфів. Обидва ці підходи покладаються на спеціальну підтримку програмного забезпечення, але частина апаратного забезпечення та програмного забезпечення повинна бути досить простою. 65,536 гліфів на 18х14 однобітних пікселів працює приблизно до 2 Мбіт, значний, але не нездоланний обсяг пам'яті на той час.

Базовій англійській мові в США потрібно щонайменше 62 виділених гліфів (цифри 0-9, літери AZ у верхньому та нижньому регістрі), тож у вас є щось на зразок 180-190 гліфів, якщо ви також хочете мати змогу одночасно відображати американський англійський текст. час і піти з 8 біт на гліф. Якщо ви можете жити без одночасної підтримки англійською мовою в США, яку ви можете вирішити робити в обмежених ресурсами середовищах, таких як рання архітектура IBM PC, ви маєте доступ до повної кількості гліфів.

З певною хитрістю ви, ймовірно, могли також змішати і поєднати дві схеми.

Я не знаю, як це було зроблено насправді, але обидва вони є життєздатними схемами, як отримати особливо "обмежені" алфавіти з обмеженим числом символів на звичайний екран комп'ютера IBM в текстовому режимі, що я можу придумати просто сидячи попереду Мить стека на мить. Цілком можливо, що існують додаткові графічні режими, які полегшують це на практиці.

Також пам’ятайте про різницю між текстовим режимом та графічним режимом, що відображає текст . Якщо ви перебуваєте в графічному режимі, можливо, через VESA, який підтримується досить повсюдно, ви самостійно ставитеся до того, як малювати гліфи символів, але ви також маєте набагато більше свободи в тому, як намалювати їх. Наприклад, я впевнений, що текстові частини Windows NT (до якої належить сімейство продуктів, до якої належить Windows XP) використовують графічний режим для відображення тексту, включаючи завантажувальний екран Windows NT 4.0 та BSOD.


Можливо, ви бачите, що поряд з подвійною шириною японські / корейські символи мають латинські символи нормальної ширини, тому це не може бути режим подвійної ширини 40x25. Тому ви не можете комбінувати 2 байти кожні 4 байти, щоб представити гліф. Використовуючи біт 3 кольору переднього плану, ви можете представляти 512 гліфів одночасно, але все ще недостатньо, якщо символи заповнюють більшу частину екрану en.wikipedia.org/wiki/VGA-compatible_text_mode#Fonts
phuclv

@ LưuVĩnhPhúc Ви можете перевлаштувати високий біт або використати будь-яку кількість можливих інших хитрощів, щоб змішати багатобайтові символи з однобайтовими. Я все ще думаю, що відповідь полягає в тому, щоб визнати твердження, зроблене у вступному параграфі: навіть коли ви показуєте символи, на певному рівні ви все ще маєте справу з пікселями, і з цими пікселями можна працювати, хоча, можливо, і не безпосередньо.
CVn

Я знаю, що вся текстова річ та текст-графічний режим відображення тексту, просто плутайте, як у них достатньо кодових точок для багатобайт, оскільки ліва та права частина вимагає 2 кодових пункту. Але з того, що ви сказали, я думав про інший спосіб зробити це. Я думаю, що ваша відповідь прийнятна
phuclv

1

Це спрощує те, що говорить @Michael Kjörling.

У текстовому режимі у вас є "екранна пам'ять", що має 1 байт на екранній символі, який повідомляє адаптеру, який символ відображається в кожному положенні екрана. (Також є байти "атрибутів", які вказують адаптеру, який колір і такі речі, як підкреслення, блимання тощо).

Адаптер використовує цей байт, щоб індексувати в іншу "таблицю символів", яка містить невелику 8x12 або будь-яку растрову картинку символу. DOS називає цю таблицю символів кодовою сторінкою.

Починаючи з CGA, ви можете сказати адаптеру отримати таблицю символів у визначеному місці в оперативній пам'яті адаптера. Кожен адаптер має символьний ПЗУ, який має типовий "шрифт" для цієї картки (який є стандартним шрифтом IBM), але ви можете сказати адаптеру перейти на місце в оперативній пам'яті та розмістити там свої власні зображення.

Поки програмне забезпечення знає, що відбувається, коди в екрані пам'яті, які вказують на зображення в таблиці символів, не мають рядків з будь-якими кодами ASCII, хоча це легше, якщо вони є. Ви помітите, що для 1-31 є коди пам'яті екрану (та форми таблиць символів), які є недрукованими символами ASCII - але, записуючи безпосередньо на екрані пам'яті (приємні спогади DEFSEG = &HB800 : POKE 0,1GW-BASIC для зміни верхнього символу на смайлик приходять розум) ви все одно можете їх відображати.

Тому відображення інших мов добре, якщо ви можете розмістити потрібні зображення в оперативній пам'яті адаптера і мати необхідну підтримку програмного забезпечення.


Це було ще в CGA? Я, мабуть, старіє. (На мою захист я написав цю відповідь значною мірою з пам’яті, і фактично не використовував ці прийоми навіть для розваги, як назавжди.)
CVn,

Я думаю, ти маєш рацію після того, як заглянеш у це, це була EGA.
LawrenceC

Я знаю, що ми можемо змінити шрифт тексту, змінивши вказівник, я навчився це робити роками раніше, просто не знаю, як вони можуть представляти двобайтовий набір символів, оскільки 256 або 512 кодових очок навіть не можуть утримувати достатньо максимальної кількості різних символів на екрані, не рахуючи всього складного
шаблону

1

Я знайшов щось на сторінці "VGA-сумісний текстовий режим" у Вікіпедії, а також у деяких книгах програмування VGA:

Як текстовий режим EGA, так і VGA дозволяє одночасно 512 гліфів на екрані, або 2 банки по 256 гліфів у кожному. Біт атрибуції 3 (інтенсивність кольорів переднього плану) також може вибирати між банком A або B. Що зазвичай трапляється, це те, що за замовчуванням і регістри шрифтів A і B вказують на одну і ту ж адресу, даючи лише 256 гліфів. Отже, щоб це працювало, ви повинні встановити регістри шрифтів на правильні адреси.

Кожен банк має 8192 байти, а кожен з 256 гліфів у банку має 32 байти (8 пікселів у ширину та 32 пікселів у висоту). Ви можете встановити реєстр лічильників сканування, щоб визначити правильну висоту своїх символів. Карти VGA друкують на екрані 400 скануючих ліній, тоді як EGA друкує 350 екранізованих на екрані, тому для того, щоб надати 25 рядків символів, вони встановлюють висоту символів до 16 та 14 ліній відповідно. Також у VGA кожен глиф може мати 8 або 9 крапок у ширину, але 9-й стовпчик або порожній, або лише повторення 8-го стовпця. Усі ці гліфи в обох банках можна визначити користувачем.

Як на деяких мовах можна отримати більше 256 різних символів на екрані? У наведених вище прикладах кожен особливий іноземний символ складається з двох гліфів (лівий і правий) або більше. Ви можете встановити перші, скажімо, 128 гліфів з банку A, крім тексту ASCII, і ви все одно матимете 128 гліфів з банку A + 256 гліфів з банку B = 384 гліфів для налаштування.

Крім того, ви можете комбінувати різні ліві та праві сторони, щоб зробити величезний набір символів! Скажімо, наприклад, що з 384 визначених користувачем гліфів ви хочете зарезервувати 184 для лівих та 200 для правого боку: у вас може бути 184 * 200 = 36800 різних символів! (звичайно, більшість з них, ймовірно, недійсні символи для цієї мови, але все ж ви можете отримати чимало дійсних комбінацій).

У прикладі японської мови вище, у вас є символи "ха" та "ба", які ділять ліворуч гліф. Те ж саме для характерників "si" та "zi". Праві сторони "ko" і "ni" настільки схожі, що вони могли поділяти один і той же гліф правого боку. Те саме можна сказати і про "ru" та "ro" символів. Завдяки гарному дизайну ви могли б дуже добре розширити набір персонажів. Правий гліф символу "le" з'являється у верхньому лівому куті екрана (сірим кольором), а у вертикальній смузі прокрутки також були змінені кнопки вгору та вниз, що означає, що принаймні частина банку A також використовувався для розміщення нових гліфів.

На закінчення, рядкові функції BIOS в ранню епоху ПК не були усвідомлені Unicode, але цього не повинно бути. Все, що вам потрібно було зробити, - налаштувати свої 512 гліфів та встановити правильні регістри EGA або VGA. Наприклад, ви можете налаштувати гліфи "! @" "# $" "% ^" "& *" "Çé" "ñÑ" для своїх іноземних символів (у банку A або B), а потім зробити друк BIOS "! @ # S% ^ & * çéñÑ "рядок одразу. BIOS не перевірятиме гліфи. Ви також не можете використовувати функції BIOS взагалі, оскільки ви можете записувати безпосередньо у відеопам'ять. Щоб використовувати гліф із банку B, просто встановіть для атрибута символу переднього кольору символ значення між 8 та 15 (яскравий колір).

(вибачте, моя погана англійська)


Я знаю, що у нас може бути 512 символів, як згадується у питанні. Однак річ у тому, що ці програми відображають справжніх персонажів Канджі , а не Кана, що значно збільшує кількість зображень, що відображаються одночасно. У системах з обмеженою кодуванням на половину ширини буде використовуватися катакана, який має окремі мару та тентен, тому однакову кодову точку можна використовувати як для し, так і для は і ば, не потрібно розділяти ліву і праву частини
phuclv

0

Я провів деякі дослідження, і, як я припускав, ви повинні використовувати графічний режим або потребуєте спеціальної апаратної підтримки, оскільки немає можливості використовувати більше 512 символів у текстовому режимі VGA

Добре, що сам DOS не може друкувати в діаграмах, що перевищують 1 байт на char, оскільки він використовує функції BIOS, які, в свою чергу, використовують апаратне забезпечення VGA, яке не може мати шрифти розміром більше 2 х 256 символів. Отже, це знову звучить як робота для DRIVER, який використовує графічний режим для візуалізації широких шрифтів. У нас вже є підтримка шрифтів Unicode в кількох графічних редакторах DOS тексту та подібних (спасибі :-)), і якщо використовується DBCS або UTF-8, обидва поділяють "розмір символу може бути одним або декількома байтами", керуючи "аномалією" .

Чи буде коли-небудь офіційна підтримка японської мови у FreeDOS?

Японська версія DOS (DOS / V) використовує перший підхід і імітує текстовий режим з допомогою візуалізації символів в графічному режимі , використовуючи спеціальний драйвер. Драйвер слідує стандарту IBM V-Text, який є механізмом розширення можливостей відображення тексту DOS. Ви можете вибрати між різними шрифтами 16/24/32/48 точок, як це

DOS / V шрифт

Деякі інші текстові режими також використовують ту саму техніку. У FreeDOS ви можете завантажити якийсь спеціальний драйвер для підтримки японців

Японський драйвер FreeDOS

Відображувач перехопить int 10h та int 21h дзвінки та намалює текст вручну, так що він буде працювати навіть для звичайних англійських програм. Але це не буде працювати для програм, які записують у пам'ять VGA безпосередньо. Для друку японських символів також підключені int 5h та int 17h.

Відповідно до посібника DOS / V пізніше IBM BIOS також додав підтримку V-Text через int 15h з наступними 4 новими функціями

5010H Video extension information acquisition
5011H Video extension function registration
5012H Video extension driver release
5013H Video extension driver lock setting

Я вважаю, що це також причина, коли я бачив підтримку японців у BIOS своїх старих ПК

Тим не менше, повільність графічного режиму може створювати глюки під час прокрутки, що потребує особливої ​​обробки

DOS / V - це фактично перше програмне рішення для японського текстового режиму

Тим часом в Японії IBM з початку 1980-х років проводилися серйозні дослідження з метою створення програмного рішення проблеми відображення японських символів. З появою моніторів VGA з високою роздільною здатністю, більш швидких процесорів та більшої пам’яті та жорстких дисків, дизайнери дослідницьких лабораторій IBM Fujisawa та Yamato зрозуміли, що інформація про форму і розмір символів кандзі може зберігатися на диску, завантажуватися в розширену пам'ять, і відображається через графічний режим VRAM. (До речі, "V" в DOS / V походить від монітора VGA, необхідного для відображення японських символів через програмне забезпечення.)

DOS / V: Програмне забезпечення (програмне забезпечення) для вирішення важких проблем

Згідно з цією ж статтею, перед винаходом DOS / V всі інші системи потребують ПЗУ Kanji в технічному забезпеченні

Усі бренди комп'ютерів використовували апаратні рішення для обробки відображення японських символів, зберігаючи дані для всіх символів на спеціальних мікросхемах, відомих як канджи ROM. Цей метод вимагав надсилати в центральний процесор двобайтовий код для кожного символу введення на клавіатурі, який, у свою чергу, вибирав відповідний символ з ПЗУ kanji та відправляв його на екран через текстовий режим VRAM. Використання ROM Kanji означало, що форма кожного символу була виправлена, тоді як використання VRAM в текстовому режимі встановлювало стандартний розмір 16x16 точок для кожного символу.

Наприклад, IBM Personal System / 55, який використовує спеціальний графічний адаптер з японським шрифтом, тому вони отримують реальний текстовий режим

На початку 1980-х IBM Японія випустила дві персональні комп'ютерні лінії на базі x86 для азіатсько-тихоокеанського регіону, IBM 5550 та IBM JX. 5550 читав шрифти Kanji з диска і малював текст у вигляді графічних символів на моніторі високої роздільної здатності 1024 x 768.

https://en.wikipedia.org/wiki/DOS/V#History

Аналогічно IBM 5550, текстовий режим був 1040x725 пікселів (шрифт 12x24 та 24x24 пікселів, 80x25 символів) у 8 кольорах, може відображати японські символи, прочитані з шрифту ROM

Архітектура AX використовує спеціальний адаптер JEGA замість стандартного EGA

AX (Architecture eXtended) - японська обчислювальна ініціатива, починаючи приблизно з 1986 року, щоб дозволити комп'ютерам обробляти двобайтовий (DBCS) японський текст за допомогою спеціальних апаратних мікросхем, дозволяючи сумісність із програмним забезпеченням, написаним для іноземних комп'ютерів IBM.

...

Для відображення символів Kanji з достатньою чіткістю AX-машини мали екрани JEGA (ja) з роздільною здатністю 640x480, а не стандартну роздільну здатність EGA 640x350, поширену в інших місцях. Зазвичай користувачі можуть перемикатися між японським та англійським режимами, ввівши «JP» та «US», що також посилатиметься на AX-BIOS та IME, що дозволяє вводити японські символи.

Пізніші версії також додають спеціальне обладнання AX-VGA / H та AX-VGA / S для емуляції програмного забезпечення на VGA

Однак незабаром після виходу AX IBM випустила стандарт VGA, з яким AX, очевидно, не сумісний (вони не були єдиними, що рекламували нестандартні розширення "super EGA"). Отже, консорціум AX повинен був розробити сумісний AX-VGA (ja). AX-VGA / H була апаратною реалізацією з AX-BIOS, тоді як AX-VGA / S була емуляцією програмного забезпечення.

Через менш доступне програмне забезпечення та інші проблеми AX вийшов з ладу і не зміг зламати домінування PC-9801 в Японії. У 1990 році IBM Японія оприлюднила DOS / V, що дозволило IBM PC / AT та його клонам відображати японський текст без додаткового обладнання за допомогою стандартної VGA-карти. Незабаром AX зник і почався спад NEC PC-9801.

У серії NEC PC-98 також є символьний ПЗУ в контролері дисплея

Стандартний ПК-98 має два контролери дисплея µPD7220 (головний і ведений) з 12 КБ основної пам'яті та 256 КБ відео оперативної пам'яті відповідно. Головний контролер дисплея обробляє шрифт ROM, відображаючи символи JIS X 0201 (7x13 пікселів) та JIS X 0208 (15x16 пікселів)

Я не знаю ситуації з китайською та корейською мовами, але, думаю, використовуються ті самі методи. Я не впевнений, чи є якісь інші способи досягти цього чи ні


-1

Вам потрібен графічний режим замість жорстко закодованого текстового режиму, щоб можна було відобразити текстові гліфи однокодування. Потім ви встановлюєте MS-DOS використовувати шрифт unicode і змінюєте відображення мови, щоб використовувати це.

http://www.mobilefish.com/tutorials/windows/windows_quickguide_dos_unicode.html


Ні, подивіться на зображення, які я розмістив, це справжній режим DOS, а не командний promt у Windows
phuclv

Заголовок у статті абсолютно невірний та оманливий. cmd.exe не є DOS, незважаючи на наявність термінального інтерфейсу, що нагадує DOS та декілька подібних команд. Чи є одне і те ж командний рядок і MS-DOS?
phuclv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.