Como o MS-DOS e outros programas no modo de texto podem exibir caracteres CJK de largura dupla?


9

Eu já vi muitas telas de configuração do BIOS em modo de texto em japonês e chinês. Recentemente, vi até a instalação do Windows XP em japonês. O MS-DOS também tinha versões em japonês. Modo DOS real , não prompt de comando do Windows!

Configuração do BIOS japonês

Japonês MS-DOS 6.2

Uma tela típica de modo de texto tem o tamanho de 80x25 . Como os caracteres japoneses ocupam o dobro da largura normal de caracteres latinos, o número máximo de caracteres japoneses que podem ser exibidos ao mesmo tempo na tela é de cerca de 1000. Portanto, precisamos de 2000 pontos de código para exibir as partes esquerda e direita dos caracteres.

Como o modo de texto padrão pode exibir apenas 256 caracteres, mas o primeiro 128 é usado para ASCII, portanto, os utilizáveis ​​são limitados aos 128 pontos de código altos. Se necessário, podemos expandi-lo para 512, mas isso ainda não suporta pontos de código suficientes para a exibição. Eu sempre me pergunto como eles conseguiram exibir o grande conjunto de caracteres com um número tão limitado de caracteres.

[ Instalador do XP japonês] 8]

O modo de texto no Linux parece usar o driver do modo gráfico porque pode exibir Unicode e possui muito mais cores. Mas não consigo explicar como eles fazem isso nas telas de configuração do MS-DOS e BIOS.


EDIT: Eu até encontrei uma entrada de texto em japonês para o DOS

IME japonês

Também há coreano no modo de texto!

coreano

VMWare Korean DOS


Você provavelmente não está vendo "caracteres" japoneses, como kanji , mas hiragana ou katakana , que possuem mapeamentos Unicode.
sawdust

@sawdust: olhar para a foto acima e você verá que ele pode exibir não só todos os kana mas também Kanji
phuclv

1
Observe que a página da qual você provavelmente tirou a captura de tela do instalador do OS / 2 diz logo ao lado da captura de tela que "o suporte ao modo de texto gráfico foi inicializado quase imediatamente ao inicializar o OS / 2". Palavra-chave gráfica .
um CVn

@ MichaelKjörling não é apenas programas de instalação do OS / 2, mas MS-DOS e do BIOS têm esta capacidade em modo texto também
phuclv

Respostas:


6

O modo normal de "80x25 caracteres" é na verdade 720x350 pixels (o que significa que cada célula de caractere tem 9 pixels de largura por 14 pixels de altura). Os modos de caracteres de largura dupla ("40x25") podem simplesmente interpolar isso para a largura maior, dobrando cada coluna para economizar na memória de conteúdo de vídeo (cortando a quantidade necessária de memória de conteúdo de vídeo pela metade) ou usar memória de glifo adicional e um idêntico quantidade de memória de conteúdo de vídeo para aumentar as células de caracteres para 18 * 14 pixels.

Bastante cedo (acho que foi feito quando o EGA foi introduzido), o suporte a glifos de caracteres definidos pelo usuário foi adicionado ao modo de exibição de texto do PC IBM.

O modo de texto normal do IBM PC é simplesmente 4000 bytes seqüenciais de RAM de conteúdo de vídeo em um endereço específico. Estes são lidos como um byte de atributos de caractere (originalmente piscando, negrito, sublinhado, etc .; posteriormente reutilizado para cores de primeiro e segundo plano e piscando / realçar, daí a limitação para 16 cores no modo de texto) e um byte descrevendo o caractere Ser exibido. O glifo real a ser exibido para cada valor de byte de caracteres é armazenado em outro local.

Isso significa que, desde que você possa se contentar com 256 glifos distintos na tela a qualquer momento, e cada glifo possa ser representado como um bitmap de 9 bits de 9x14, você pode simplesmente substituir os glifos na memória para fazer com que os caracteres apareçam de maneira diferente . Em parte, essa foi uma parte do que mode con codepage selectocorreu no DOS. Isso é relativamente trivial.

Se você precisar de mais de 256 glifos distintos, mas conseguir viver com o número reduzido de glifos na tela, poderá seguir um esquema de 40x25 com glifos de largura dupla (18 pixels de largura). Supondo que a quantidade total de RAM de conteúdo de vídeo seja fixa e supondo que você possa aumentar a memória de bitmap de glifo, você pode usar dois bytes de quatro em quatro bytes para representar um glifo na tela, dando acesso a 2 ^ 16 = 65.536 glifos diferentes (incluindo o glifo em branco). Se você se sente ousado, pode até pular o segundo byte de atributo, que fornece acesso a 2 ^ 24 ~ 16,7M diferentes glifos. Ambas as abordagens dependem de suporte de software especial, mas a parte do hardware e do firmware deve ser bastante fácil de fazer. 65.536 glifos em pixels de um bit de 18x14 funcionam para cerca de 2 MiB, uma quantidade considerável de memória, mas não insuperável, no momento.

O inglês básico dos EUA precisa de pelo menos 62 glifos dedicados (números 0-9, letras AZ em maiúsculas e minúsculas), para que você tenha algo como 180-190 glifos para brincar se também quiser exibir o texto em inglês dos EUA da mesma forma tempo e vá com 8 bits por glifo. Se você pode viver sem o suporte simultâneo em inglês dos EUA, o que pode optar por fazer em um ambiente com recursos limitados, como a arquitetura antiga do IBM PC, você tem acesso ao número completo de glifos.

Com alguns truques, você provavelmente poderia combinar e combinar os dois esquemas também.

Eu não sei como isso foi realmente feito, mas esses dois são esquemas viáveis ​​para obter alfabetos "sofisticados" com contagem limitada de caracteres em uma tela simples de PC IBM no modo de texto que eu posso pensar em sentar na frente do Stack Exchange por um momento. É perfeitamente possível que haja modos gráficos adicionais que facilitem isso na prática.

Além disso, lembre-se da distinção entre o modo de texto e o modo gráfico que exibe o texto . Se você estiver no modo gráfico, talvez através do VESA, que é bastante universalmente suportado, estará por conta própria no que diz respeito aos glifos dos personagens, mas também terá muito mais liberdade para desenhá-los. Por exemplo, tenho certeza de que as partes baseadas em texto do Windows NT (que é a família de produtos ao qual o Windows XP pertence) usam um modo gráfico para exibir texto, incluindo a tela de inicialização do Windows NT 4.0 e BSODs.


Você pode ver que existem caracteres latinos de largura normal, além dos japoneses / coreanos de largura dupla, portanto não pode ser o modo de largura dupla de 40x25. Portanto, você não pode combinar 2 bytes a cada 4 bytes para representar o glifo. Usando bit 3 da cor de primeiro plano você pode representar 512 glifos, ao mesmo tempo, mas ainda não o suficiente se os personagens preencher a maior parte da tela en.wikipedia.org/wiki/VGA-compatible_text_mode#Fonts
phuclv

@ LưuVĩnhPhúc Você pode recuperar o bit mais alto ou usar qualquer número de outros truques possíveis para misturar caracteres que requerem vários bytes com caracteres de um byte. Ainda acho que a resposta é reconhecer a afirmação feita no parágrafo de abertura: mesmo ao mostrar caracteres, em algum nível você ainda está lidando com pixels, e esses pixels podem ser trabalhados mesmo que talvez não diretamente.
um CVn 20/09/13

Eu sei que toda a coisa baseada em texto e em modo de exibição de texto em modo gráfico, apenas confunde como eles têm pontos de código suficientes para multibyte, pois a parte esquerda e direita exigem 2 pontos de código. Mas pelo que você disse, pensei em outra maneira de fazê-lo. Eu acho que a sua resposta é aceitável
phuclv

1

Isso está simplificando o que @Michael Kjörling está dizendo.

No modo de texto, você tem "memória na tela" com 1 byte por caractere na tela que informa ao adaptador qual caractere aparece em cada posição da tela. (Também existem bytes de "atributo" que informam ao adaptador que cor e coisas como sublinhado, piscam etc.).

O adaptador usa esse byte para indexar em outra "tabela de caracteres" que possui o pequeno 8x12 ou qualquer bitmap do caractere. O DOS chama essa tabela de caracteres de uma página de código.

Começando com CGA, você pode dizer ao adaptador para obter a tabela de caracteres em um local específico na RAM do adaptador. Cada adaptador possui uma ROM de caracteres que possui a "fonte" padrão para esse cartão (que é a fonte padrão da IBM), mas você pode dizer ao adaptador para alternar para um local na RAM e colocar suas próprias imagens lá.

Desde que o software saiba o que está acontecendo, os códigos na memória da tela que apontam para as imagens na tabela de caracteres não têm alinhamento com nenhum código ASCII, embora seja mais fácil. Você notará que existem códigos de memória de tela (e formas da tabela de caracteres) para 1-31 que são caracteres ASCII não imprimíveis - mas escrevendo diretamente na memória de tela (boas lembranças DEFSEG = &HB800 : POKE 0,1no GW-BASIC para alterar o caractere mais alto para um smiley) mente) você ainda pode exibi-los.

Portanto, é bom exibir outros idiomas, se você puder colocar as imagens corretas na RAM do adaptador e ter o suporte de software necessário.


Foi tão cedo quanto a CGA? Eu devo estar ficando velho. (Para minha defesa, escrevi essa resposta em grande parte da memória e, na verdade, não utilizei essas técnicas nem por diversão como sempre.)
um CVn

Eu acho que você está logo depois de investigar, era EGA.
LawrenceC

Sei que podemos alterar a fonte do texto alterando o ponteiro, aprendi como fazê-lo anos antes, apenas não sei como eles podem representar o conjunto de caracteres de byte duplo, pois 256 ou 512 pontos de código não conseguem aguentar suficiente o número máximo de diferentes personagens na tela, sem contar todo o complexo charset
phuclv

1

Encontrei algo na página "modo de texto compatível com VGA" na Wikipedia e também em alguns livros de programação VGA:

Os modos de texto EGA e VGA permitem 512 glifos simultâneos na tela ou 2 bancos com 256 glifos cada. O bit de atributo 3 (Intensidade da cor do primeiro plano) também pode selecionar entre o banco A ou B. O que normalmente ocorre é que, por padrão, os Registradores de fontes A e B apontam para o mesmo endereço, fornecendo apenas 256 glifos. Portanto, para que ele funcione, é necessário definir os Registradores de fontes com os endereços corretos.

Cada banco possui 8192 bytes e cada um dos 256 glifos do banco possui 32 bytes (8 pixels de largura e 32 pixels de altura). Você pode definir o registro do Scanline Count para informar a altura correta dos seus caracteres. Os cartões VGA imprimem 400 linhas de digitalização na tela, enquanto a EGA imprime 350 linhas de digitalização na tela; portanto, para fornecer 25 linhas de caracteres, eles definem sua altura de caracteres para 16 e 14 linhas de digitalização, respectivamente. Além disso, em VGA, cada glifo pode ter 8 ou 9 pontos de largura, mas a 9ª coluna está em branco ou apenas uma repetição da 8ª coluna. Todos esses glifos nos dois bancos podem ser definidos pelo usuário.

Como você pode obter mais de 256 caracteres diferentes na tela em alguns idiomas? Nos exemplos acima, cada caractere estranho especial é composto de dois glifos (esquerda e direita) ou mais. Você pode definir o primeiro, digamos, 128 glifos do banco A à parte para o texto ASCII, e ainda terá 128 glifos do banco A + 256 glifos do banco B = 384 glifos para personalizar.

Além disso, você pode combinar diferentes lados esquerdo e direito para criar um conjunto enorme de caracteres! Digamos, por exemplo, que dos 384 glifos definidos pelo usuário, você deseja reservar 184 para o lado esquerdo e 200 para o lado direito: você pode ter 184 * 200 = 36800 caracteres diferentes! (com certeza, a maioria deles provavelmente seria caracteres inválidos para esse idioma, mas você ainda pode obter um bom número de combinações válidas).

No exemplo do idioma japonês acima, você tem os caracteres "ha" e "ba" compartilhando o glifo do lado esquerdo. O mesmo para os caracteres "si" e "zi". Os lados direito "ko" e "ni" são tão semelhantes que poderiam compartilhar o mesmo glifo do lado direito. O mesmo poderia ser dito sobre os caracteres "ru" e "ro". Com um bom design, você pode expandir seu conjunto de caracteres muito bem. O glifo do lado direito do caractere "le" aparece no canto superior esquerdo da tela (em cinza) e, na barra de rolagem vertical, os botões para cima e para baixo também foram alterados, o que significa que pelo menos uma parte do banco A também foi usado para acomodar os novos glifos.

Em conclusão, as funções de string do BIOS no início do PC não eram compatíveis com Unicode, mas não precisam ser. Tudo o que você precisava fazer era personalizar seus 512 glifos e definir os registros EGA ou VGA corretos. Por exemplo, você pode personalizar os glifos "! @" "# $" "% ^" "& *" "Çé" "ñÑ" para seus caracteres estrangeiros (no banco A ou B) e depois imprimir a BIOS "! @ # S% ^ & * çéñÑ "string de uma só vez. O BIOS não verifica os glifos. Você também não pode usar as funções do BIOS, pois pode escrever diretamente na memória de vídeo. Para usar um glifo do banco B, basta definir o atributo Cor do primeiro plano do caractere para um valor entre 8 e 15 (cor brilhante).

(desculpe meu inglês ruim)


Eu sei que podemos ter 512 caracteres, como mencionado na pergunta. No entanto, o fato é que os programas acima estão exibindo os caracteres Kanji reais , não Kana, o que aumenta significativamente o número de itens exibidos ao mesmo tempo. Em sistemas com codificação limitada, Katakana de meia largura será usado, que possui maru e décimo separados, para que o mesmo ponto de código possa ser usado para し e じ, ou は e ば, sem a necessidade de compartilhar as partes esquerda e direita
phuclv

0

Fiz algumas pesquisas e, como previ, é necessário usar o modo gráfico ou precisar de suporte especial de hardware, porque não há como usar mais de 512 caracteres no modo de texto VGA

Bem, o próprio DOS não pode imprimir em conjuntos de caracteres além de 1 byte por caractere, porque usa as funções do BIOS que, por sua vez, usam o hardware VGA que não pode ter mais do que 2 x 256 caracteres do tamanho de caracteres. Portanto, isso novamente soa como um trabalho para um DRIVER, que usa o modo gráfico para renderizar fontes extensas. Já temos suporte para fontes Unicode em alguns editores de texto gráficos do DOS e similares (obrigado :-)) e, se DBCS ou UTF-8 é usado, ambos compartilham o "tamanho do caractere pode ter um ou mais bytes", manipulando "anomalia" .

Haverá algum suporte oficial para o idioma japonês no FreeDOS?

A versão japonesa do DOS (DOS / V) utiliza a primeira abordagem e simula o modo de texto por tornar os caracteres em modo gráfico usando um driver especial. O driver segue o padrão IBM V-Text, que é um mecanismo para estender os recursos de exibição de texto do DOS. Você pode escolher entre várias fontes de 16/24/32/48 pontos como esta

Fonte DOS / V

Alguns outros sistemas de modo de texto também usam a mesma técnica. No FreeDOS, você pode carregar algum driver especial para suporte ao japonês

Driver japonês FreeDOS

O renderizador interceptará as chamadas int 10h e int 21h e desenhará o texto manualmente, para que funcione mesmo em programas normais de inglês. Mas não funcionará para programas que gravam diretamente na memória VGA. Para imprimir caracteres japoneses int 5h e int 17h também são viciados.

De acordo com o manual do DOS / V, mais tarde, o IBM BIOS também adicionou suporte ao V-Text até as 15h com as 4 novas funções abaixo

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

Suponho que esse também seja o motivo pelo qual vi suporte japonês nos BIOS dos meus PCs antigos

No entanto, a lentidão do modo gráfico pode apresentar falhas durante a rolagem, o que exige um tratamento especial

O DOS / V é realmente a primeira solução de software para o modo de texto em japonês

Enquanto isso, uma pesquisa séria vinha sendo realizada na IBM Japão desde o início dos anos 80 para produzir uma solução de software para o problema de exibição de caracteres japoneses. Com o advento de monitores VGA de alta resolução, processadores mais rápidos e memórias e discos rígidos maiores, os designers dos laboratórios de pesquisa Fujisawa e Yamato da IBM perceberam que as informações sobre a forma e o tamanho dos caracteres kanji podiam ser armazenadas em disco, carregadas na memória estendida, e exibido por meio da VRAM no modo gráfico. (A propósito, o "V" no DOS / V vem do monitor VGA necessário para exibir os caracteres japoneses via software.)

DOS / V: a solução suave (ware) para problemas difíceis (ware)

De acordo com o mesmo artigo, antes da invenção do DOS / V, todos os outros sistemas precisam de uma ROM Kanji em hardware

Todas as marcas de computadores usavam soluções de hardware para lidar com a exibição de caracteres japoneses, armazenando os dados de todos os caracteres em chips especiais conhecidos como ROMs de kanji. Esse método exigia que o código de byte duplo de cada caractere da entrada do teclado fosse enviado à CPU, que, por sua vez, buscava o caractere correspondente da ROM do kanji e o enviava para a tela via VRAM em modo de texto. O uso da ROM kanji significava que o formato de cada caractere era fixo, enquanto o uso do VRAM no modo de texto definia um tamanho de ponto padrão de 16x16 para cada caractere.

Por exemplo, o IBM Personal System / 55, que usa um adaptador gráfico especial com fonte japonesa, para que eles obtenham o modo de texto real

No início dos anos 80, a IBM Japão lançou duas linhas de computadores pessoais baseadas em x86 para a região do Pacífico Asiático, IBM 5550 e IBM JX. O 5550 leu fontes Kanji do disco e desenhou o texto como caracteres gráficos no monitor de alta resolução 1024 x 768.

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

Semelhante ao IBM 5550, o modo de texto era 1040x725 pixels (fonte de 12x24 e 24x24 pixel, 80x25 caracteres) em 8 cores, pode exibir caracteres japoneses lidos na fonte ROM

A arquitetura AX usa um adaptador JEGA especial em vez do EGA padrão

O AX (Architecture eXtended) foi uma iniciativa de computação japonesa que começou em torno de 1986 para permitir que os PCs manipulem texto japonês de byte duplo (DBCS) por meio de chips de hardware especiais, permitindo compatibilidade com software criado para PCs IBM estrangeiros.

...

Para exibir caracteres Kanji com clareza suficiente, as máquinas AX tinham telas JEGA (ja) com uma resolução de 640x480 em vez da resolução EGA padrão de 640x350 prevalecente em outros lugares da época. Os usuários normalmente podiam alternar entre os modos japonês e inglês, digitando 'JP' e 'US', o que também invocaria o AX-BIOS e um IME, permitindo a entrada de caracteres japoneses.

Versões posteriores também adicionam um hardware AX-VGA / H especial e AX-VGA / S para emulação de software no VGA

No entanto, logo após o lançamento do AX, a IBM lançou o padrão VGA com o qual o AX obviamente não era compatível (eles não foram os únicos a promover extensões "super EGA" não padrão). Consequentemente, o consórcio AX teve que projetar um AX-VGA compatível (ja). O AX-VGA / H era uma implementação de hardware com o AX-BIOS, enquanto o AX-VGA / S era uma emulação de software.

Devido a menos software disponível e outros problemas, o AX falhou e não conseguiu quebrar o domínio do PC-9801 no Japão. Em 1990, a IBM Japão lançou o DOS / V, que permitiu ao IBM PC / AT e seus clones exibir texto em japonês sem nenhum hardware adicional usando uma placa VGA padrão. Logo depois, o AX desapareceu e o declínio do NEC PC-9801 começou.

A série NEC PC-98 também possui uma ROM de caracteres no controlador de vídeo

Um PC-98 padrão possui dois controladores de vídeo µPD7220 (um mestre e um escravo) com 12 KB de memória principal e 256 KB de RAM de vídeo, respectivamente. O controlador de vídeo mestre lida com a fonte ROM, exibindo caracteres JIS X 0201 (7x13 pixels) e JIS X 0208 (15x16 pixels)

Não sei a situação para chinês e coreano, mas acho que as mesmas técnicas são usadas. Não tenho certeza se existem outras maneiras de conseguir isso ou não


-1

Você precisa de um modo gráfico em vez de um modo de texto codificado para que os glifos de texto unicode possam ser exibidos. Em seguida, você define o MS-DOS para usar uma fonte unicode e altera o mapeamento de idioma para usá-lo.

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


Não, olhar para as imagens que eu postei, é o modo DOS real, não promt de comando no Windows
phuclv

O título do artigo é completamente errado e enganoso. O cmd.exe não é DOS, apesar de ter uma interface de terminal semelhante ao DOS e alguns comandos semelhantes. O prompt de comando e o MS-DOS são a mesma coisa?
phuclv
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.