Pergunta

Na semana passada, tenho trabalhado em um roguelike Jogo em C ++ junto com um amigo. Principalmente aprender o idioma.

Estou a usar:

Para a saída wchar_tonde quer que eu queira no console. Consegui superar alguns caracteres unicode, como u263b (☻), mas outros como u2638 (☸) acabam acabando como pontos de interrogação (?).

Aqui está o código relevante que eu uso para saída.

// Container of room information

struct RoomInfo
{
    wchar_t * layout;
    int width;
    int height;
};

// The following function builds RoomInfo 

RoomInfo Room::examine(IActor * examinor)
{
    RoomInfo ri;
    ri.width = this->width;
    ri.height = this->height;
    ri.layout = new wchar_t[height * width];
    for(unsigned int y = 0; y < height; y++)
    {
        for(unsigned int x = 0; x < width; x++)
        {
            ri.layout[y*width + x] = L'\u263B'; // works
            //ri.layout[y*width + x] = L'\u2638'; // will not work
        }
    }
}

// The following function outputs RoomInfo

void CursesConsole::printRoom(RoomInfo room)
{
    int w = room.width;
    int h = room.height;

    WINDOW * mapw = newwin(h, w, 1, 0);
    for(int y = 0; y < h; y++)
    {
        wmove(mapw, y, 0);
        for(int x = 0; x < w; x++)
        {
            int c = y*w + x;
            waddch(mapw, room.layout[c]);
        }
    }

    wrefresh(mapw);
    delwin(mapw);
}

É claro que eu poderia voltar aos chatos do Ansi-Characters. Mas seria realmente incrível ter o conjunto completo de personagens do Unicode para brincar.

Resumindo: Como você garante que os caracteres Unicode sejam produzidos corretamente?


Editar:

Ok, então eu descobri que minha codificação está funcionando corretamente. O problema é que Eu preciso forçar o terminal a mudar para uma fonte mais rica em unicode. Existe uma maneira de plataforma cruzada de fazer isso? Existe até uma maneira específica do Windows de fazer isso?

Foi útil?

Solução

O problema é que preciso forçar o terminal a mudar para uma face de fonte mais rica em unicode. Existe uma maneira de plataforma cruzada de fazer isso? Existe até uma maneira específica do Windows de fazer isso?

Eu dei uma olhada por isso, mas não consegui encontrar uma chamada da API do Windows para fazê -lo (o que pode significar que não o encontrei, é claro). Eu não esperaria encontrar uma maneira de plataforma cruzada para fazê-lo.

A melhor solução que consigo pensar é lançar o console usando um especialmente construído Link de shell (.Lnk) arquivo. Se você ler o documentação do formato de arquivo, você verá que ele permite especificar uma fonte.

Mas seus problemas não terminam aí. Uma instalação de local de localidade ocidental fornece Console de Lucida, mas essa fonte fornece apenas um subconjunto limitado de grafemas. Suponho que você possa produzir/entrar em texto japonês no console em um PC Windows japonês. Você precisaria verificar o que está disponível em uma janela japonesa se quisesse ter certeza de que funcionaria lá.

O Linux (Ubuntu, pelo menos) parece ter um suporte muito melhor aqui, usando o UTF-8 e fornecendo uma fonte com suporte de grafema amplo. Não verifiquei outras distros para ver o que a história está lá, nem verifiquei como as fontes são resolvidas no terminal (seja uma coisa X, uma coisa do gnome ou o que quer que seja).

Outras dicas

Em princípio, todos os caracteres Unicode são suportados no console. O fato de você estar vendo pontos de interrogação provavelmente tem a ver com o suporte de fontes para esses personagens. Tente alternar a fonte do console para algo com suporte muito bom do Unicode.

Você precisa definir a página de código corretamente. Há um artigo muito bom sobre isso aqui: link

Embora seja uma mudança muito grande, você pode tentar usar um console alternativo, especialmente se estiver fazendo uma mal -humorado. LIBTCOD é uma biblioteca moderadamente popular, escrita em C com ligações C ++, que fornece um console de cores na qual você pode configurar suas próprias fontes e glifos. Isso deve lhe dar muito mais flexibilidade do que ficar preso ao que o console do Windows oferece.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top