Ir ao conteúdo
  • Cadastre-se

C++ Estou Tentando traduzir um jogo


Posts recomendados

 

Estou traduzindo um jogo mas manualmente da muito trabalho, á 155 caracteres cada um sendo alguma letra ou simbolo poderiam me dar um exemplo de um código que pode me dizer se esses números são uma certa palavra, por exemplo 48,45,105 significa OLÁ, só quero um exemplo de como seria o código o resto eu faço sozinho.

Agradeço pela ajuda.

CharTable.txt

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Carlos Vinicius Coelho Quer substituir o número do caractere pelo caractere em si? De onde vai ler isso? De um arquivo texto? E o que vai fazer com isso? Imprimir na tela? Aliás, de onde veio esse "CharTable" aí?

A princípio, o que o programa deveria fazer é ler o número, verificar de qual caractere se trata e então substituir. Em C seria algo assim:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main()
{
    setlocale(LC_ALL, "en_US.utf8");
    
    const wchar_t ciclone = 0x1F300;
    int num;
    
    printf("Insira o numero do caractere: ");
    scanf("%d", &num);
    
    if(num == 0){
      	// Número 0 corresponde ao emoji do ciclone
        printf("Caractere correspondente: %lc", ciclone);
    }

    return 0;
}

Precisa mesmo fazer um programa pra isso? Não prefere usar uma ferramenta online como essa?

PS: se precisar ver as informações de outros caracteres, peguei as informações desse emoji de ciclone daqui.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

O arquivo CharTable são os números é o que cada um representa o que quero é so um exemplo de uma código que me digo que frase é  essa como essa 48,45,105 significa OLÁ.

Alias sim  Lucca Rodrigues estava tentando achar algum programa ou algo parecido assim mesmo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Carlos Vinicius Coelho Imprimir emojis ou qualquer coisa que não esteja na tabela ASCII convencional vai ser o mais difícil imagino... O exemplo (em C) ta lá, para 1 caractere e verifica somente o primeiro da lista.

Agora, faça as condições para os outros casos, use um laço para pedir números enquanto o usuário quiser, use um laço para avaliar cada número que o usuário inseriu, etc. Talvez você possa ler os números de um arquivo texto, e talvez possa armazenar os caracteres em um arquivo texto também, vai de sua vontade.

Ou então use uma ferramenta online. Se você não tem que estritamente fazer um programa pra isso, com certeza pode usar ferramentas que estão disponíveis gratuitamente.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Não dever ser tão difícil assim mas também a minha versão do dev-c++ esta dizendo que meu programa não esta compilado e não executa tentei pegar programas criados por alguém para testar mas também da no mesmo.

adicionado 8 minutos depois

Estou usando a ferramenta que você recomendou esta ajudando muito, obrigado@Lucca Rodrigues.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

10 horas atrás, Carlos Vinicius Coelho disse:

por exemplo 48,45,105 significa OLÁ,

 

🤔 Isso era pra ser algo simples mas é um inferno. No fundo era pra ser uma simples tabela de look-up onde você tem uma matriz de referência com o código resultante e usa para substituir o valor numérico. Algo como

		char ref[256];

E você na saída usa ref[ buffer ] e "traduz" a letra lida em buffer. Muito simples e super rápido. São 256 possibilidades por byte, então é só preencher e já era. Postei códigos aqui que fazem isso.

 

Claro, depois de feita a substituição teria que ter algum tipo de dicionário para você pesquisar a palavra, se é isso que precisa fazer. 

 

Na prática não há como garantir que ao abrir isso alguém vá estar vendo a mesma representação do caracter que você viu. Vai depender da fonte em uso, da página de código em uso no computador e como o cara vai abrir isso: no Terminal do windows? Num editor de texto? Numa console?  Isso é o d1@b0. Não faça se não for mesmo importante ou pago ou os dois.

 

Veja um pedaço do seu arquivo aberto no bloco de notas no computador que estou usando

 

image.png.4bbf43613133b310cefdb0370c708644.png

 

Está certo sobre o 105?

 

image.png.cc54a3c9c72f05cf9613de7898940e02.pngimage.png.a38c70ab89fb9617aa155e4dfa6f9c2b.png

 

Acima você vê parte do problema. Pode seer que a fonte em uso não tenha as letras que quer ou tenha outra representação para o símbolo.

 

Veja no Windows esse aplicativo:
 

image.png.439f6eb0208a218bb6da59c93ceed381.png

 

Por exemplo essa "letra" 26 14 é perfeitamente legal. E meiga. Mas vai sair na tela? Pode ser...
 

De todo modo entenda que vai ser preciso saber qual fonte está em uso no momento e também a página de código. E também esse lance aí no link acima: novos recursos da console. E também se está usando uma versão recente de Windows ou Linux.

 

Unicode
 

Só que seu arquivo está codificado em Unicode. UTF-8. E tem uma marca nele, algo chamado BOM, que vem logo no início e é opcional. Claro que se é opcional e não estiver lá não dá pra saber a codificação do arquivo. Claro que também se você não ler como tal não vai saver o que é.


Só problema.
 

E UTF-8 é multi-byte e então lá se foi a tabela de referência: os "letras" podem ser mais de 150.000 delas e podem ter 1, 2, 3 ou 4 bytes cada uma. Então a tabela de referência teria que ser algo assim

	char ref[256][4] // ou talvez
	char* ref[155]; // no seu caso
	wchar_t ref[256]; // pode ser também

Seria preciso saber o propósito e aí sim criar uma solução. Mas não é certo que vá funcionar a menos que controle a fonte, a página de código e talvez outros parâmetros.

 

De volta ao arquivo


Esse programa C

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
    const unsigned char BOM[3] = { '\xEF', '\xBB', '\xBF' };
    char file_name[64] = { "CharTable.txt" };
    if (argc > 1) strcpy(file_name, argv[1]);
    FILE* one = fopen(file_name, "r+b");
    if (!one) return -1;
    unsigned char buffer[64];
    int n = fread(buffer, 1, 3, one);
    if (n != 3)return -2;
    if (memcmp(buffer, BOM, 3) != 0)
    {
        printf("Marca BOM nao encontrada em '%s'\n", file_name);
        fclose(one);
        return 0;
    };
    printf("Marca UTF-8 encontrada\n");
    char st = 0;
    n = fread(buffer, 1, 1, one);
    if (n != 1) return -1;
    while (!feof(one))
    {
        // a = b
        switch (st)
        {
        case 0:
            if (buffer[0] == '=')
            {
                st = 1;
                printf("= [ ");
            }
            else
            {
                printf("%c", buffer[0]);
            }
                break;
        case 1:
            if (buffer[0] == '\r')
            {
                st = 0;
                n = fread(buffer, 1, 1, one);
                printf(" ]\n");
            }
            else
            {
                printf("0x%0X ", buffer[0]);
            };  // if()
            break;
        default:
            break;
        };  // switch()
        n = fread(buffer, 1, 1, one);
    };
    fclose(one);
    return 0;
}

Deve ajudar a entender.  Para o seu arquivo ele mostra:

Marca UTF-8 encontrada
0= [ 0xF0 0x9F 0x8C 0x80  ]
1= [ 0x21  ]
2= [ 0x20  ]
3= [ 0x22  ]
4= [ 0x23  ]
5= [ 0xE2 0x86 0x91  ]
6= [ 0x25  ]
7= [ 0x26  ]
8= [ 0x27  ]
9= [ 0x28  ]
10= [ 0x29  ]
11= [ 0x2A  ]
12= [ 0x2B  ]
13= [ 0x2C  ]
14= [ 0x2D  ]
15= [ 0x2E  ]
16= [ 0x2F  ]
17= [ 0x30  ]
18= [ 0x31  ]
19= [ 0x32  ]
20= [ 0x33  ]
21= [ 0x34  ]
22= [ 0x35  ]
23= [ 0x36  ]
24= [ 0x37  ]
25= [ 0x38  ]
26= [ 0x39  ]
27= [ 0x3A  ]
28= [ 0x3B  ]
29= [ 0xE2 0x86 0x90  ]
30= [ 0x3D  ]
31= [ 0xE2 0x86 0x92  ]
32= [ 0x3F  ]
33= [ 0xE2 0x86 0x93  ]
34= [ 0x41  ]
35= [ 0x42  ]
36= [ 0x43  ]
37= [ 0x44  ]
38= [ 0x45  ]
39= [ 0x46  ]
40= [ 0x47  ]
41= [ 0x48  ]
42= [ 0x49  ]
43= [ 0x4A  ]
44= [ 0x4B  ]
45= [ 0x4C  ]
46= [ 0x4D  ]
47= [ 0x4E  ]
48= [ 0x4F  ]
49= [ 0x50  ]
50= [ 0x51  ]
51= [ 0x52  ]
52= [ 0x53  ]
53= [ 0x54  ]
54= [ 0x55  ]
55= [ 0x56  ]
56= [ 0x57  ]
57= [ 0x58  ]
58= [ 0x59  ]
59= [ 0x5A  ]
60= [ 0x5B  ]
61= [ 0xC3 0xA9  ]
62= [ 0x5D  ]
63= [ 0xE2 0x86 0x93  ]
64= [ 0x5F  ]
65= [ 0xC2 0xB4  ]
66= [ 0x61  ]
67= [ 0x62  ]
68= [ 0x63  ]
69= [ 0x64  ]
70= [ 0x65  ]
71= [ 0x66  ]
72= [ 0x67  ]
73= [ 0x68  ]
74= [ 0x69  ]
75= [ 0x6A  ]
76= [ 0x6B  ]
77= [ 0x6C  ]
78= [ 0x6D  ]
79= [ 0x6E  ]
80= [ 0x6F  ]
81= [ 0x70  ]
82= [ 0x71  ]
83= [ 0x72  ]
84= [ 0x73  ]
85= [ 0x74  ]
86= [ 0x75  ]
87= [ 0x76  ]
88= [ 0x77  ]
89= [ 0x78  ]
90= [ 0x79  ]
91= [ 0x7A  ]
92= [ 0x7B  ]
93= [ 0xF0 0x9F 0x90 0x9B  ]
94= [ 0x7D  ]
95= [ 0x7E  ]
96= [ 0xC3 0x89  ]
97= [ 0xC3 0xA9  ]
98= [ 0xC3 0xAA  ]
99= [ 0xC3 0xAA  ]
100= [ 0xC3 0xAD  ]
101= [ 0xC3 0x8D  ]
102= [ 0xC3 0xAF  ]
103= [ 0xC3 0x8F  ]
104= [ 0xC3 0x81  ]
105= [ 0xC3 0x9A  ]
106= [ 0xC3 0x80  ]
107= [ 0xC3 0x99  ]
108= [ 0xC3 0x88  ]
109= [ 0xC3 0x82  ]
110= [ 0xC3 0x94  ]
111= [ 0xC3 0x8A  ]
112= [ 0xC3 0x9B  ]
113= [ 0xC3 0x83  ]
114= [ 0xC3 0x91  ]
115= [ 0xC3 0x84  ]
116= [ 0xC3 0x85  ]
117= [ 0xC3 0x8E  ]
118= [ 0xC5 0xB8  ]
119= [ 0xC3 0x93  ]
120= [ 0xC3 0x9F  ]
121= [ 0xC3 0x96  ]
122= [ 0xC3 0x9C  ]
123= [ 0xC5 0x92  ]
124= [ 0xC3 0x86  ]
125= [ 0xC3 0x98  ]
126= [ 0xC3 0x95  ]
127= [ 0xC3 0x8C  ]
128= [ 0xC3 0x87  ]
129= [ 0xC3 0xA1  ]
130= [ 0xC3 0xA0  ]
131= [ 0xC3 0xBA  ]
132= [ 0xC3 0xB9  ]
133= [ 0xC3 0xA8  ]
134= [ 0xC3 0xA2  ]
135= [ 0xC3 0xB4  ]
136= [ 0xC3 0xAA  ]
137= [ 0xC3 0xBB  ]
138= [ 0xC3 0xA3  ]
139= [ 0xC3 0xB1  ]
140= [ 0xC3 0xA4  ]
141= [ 0xC3 0xA5  ]
142= [ 0xC5 0x93  ]
143= [ 0xC3 0xAE  ]
144= [ 0xC3 0xBF  ]
145= [ 0xC3 0xB3  ]
146= [ 0xC3 0xB2  ]
147= [ 0xC3 0xB6  ]
148= [ 0xC3 0xBC  ]
149= [ 0xC3 0xA6  ]
150= [ 0xC3 0xB8  ]
151= [ 0xC3 0xA7  ]
152= [ 0xC3 0xAC  ]
153= [ 0xC2 0xBF  ]
154= [ 0xC2 0xA1  ]
155= [ 0xC3 0x92 

Sim, eu esqueci de finalizar o último valor :) 

 

Mas é o valor dos bytes em hexadecimal que estão na sua tabela e vão corresponder aos "code points" em Unicode.

 

E você vê que alguns tem 1 byte. Outros 2, 3 ou 4. É muito chato.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...