¡Urgente! Cómo mostrar caracteres chinos en lenguaje C
En primer lugar, déjame explicarte: es más problemático mostrar caracteres chinos en TC. Si realmente quieres usarlo, puedes usar VC.
Caracteres chinos enrejados en DOS
¿Alguna vez te has encontrado con una cadena de caracteres incomprensibles usando el comando DIR después de iniciar el sistema con un disco de arranque? Los amigos experimentados te lo dirán: esos son caracteres chinos. ¿Carácter chino? No puedes evitar preguntar: ¿Por qué no reconozco a ninguno de ellos? Pero esos son de hecho caracteres chinos. Si inicia UCDOS u otros sistemas de caracteres chinos, verá que son caracteres chinos familiares. Para los mismos caracteres chinos, ¿por qué vemos resultados diferentes antes y después? Jaja, de hecho, en el hardware de la computadora, no existe ningún concepto de caracteres chinos, y no existe ningún concepto de inglés. El único concepto que conoce esta cosa de hierro es el código interno.
☆El código interno de los caracteres chinos
¿Qué significa asentir? Significa "correcto" o "SÍ", pero en algunos lugares significa exactamente lo contrario. Una acción tiene diferentes interpretaciones; una pregunta tiene diferentes respuestas; y un símbolo tiene diferentes significados. La clave está en cómo lo entiendes. Lo mismo ocurre en las computadoras. Todos los datos se guardan como 0 y 1. Si opera con datos diferentes, puede obtener resultados diferentes. Para mostrar operaciones en inglés, dado que hay muy pocos tipos de letras en inglés, sólo se necesitan 8 bits (un byte). Para el chino, hay más de 5000 de uso común, por lo que nuestros predecesores de DOS idearon una manera de usar los 128 valores superiores de la tabla ASCII que rara vez se usan para representar caracteres chinos en grupos de dos, es decir, el Código interno de caracteres chinos. Los 128 bits inferiores restantes están reservados para caracteres ingleses, es decir, el código interno del inglés. Si no lo cree, puede usar el Bloc de notas para escribir un archivo C:
main()
{
unsigned char *s,*e ="ABcd",* c="Hola";
clrscr();
printf("English char =");
s=e;
while(*s!=0) /*La cadena C termina en 0*/
{
printf("%3d,",*s)
s++;
}
printf("\nChinease char=");
s=c;
while(*s!=0)
{
printf("%3d,",*s);
s++;
}
getch();
}
Usa TC para ingresar *.txt para abrir y ejecutar. ¿Viste que los valores? ¿Son caracteres ingleses y chinos? El código interno de cada byte.
☆Fuente de caracteres chinos
Después de obtener el código interno de los caracteres chinos, sigue siendo solo un conjunto de números, entonces, ¿cómo mostrarlo en la pantalla? Se trata de la fuente del texto. Aunque la fuente también es un conjunto de números, su significado ha cambiado fundamentalmente con respecto al significado de los números. Utiliza información digital para registrar la forma de los caracteres ingleses o chinos. En el sistema de hardware, la información de la fuente en inglés generalmente está solidificada en la ROM, lo que le permite ver caracteres en inglés incluso en CMOS que no han ingresado al sistema. En DOS, la información de las fuentes chinas generalmente se registra en el archivo de biblioteca de caracteres chinos HZK16.
☆Archivo de biblioteca de caracteres chinos
Después de comprender el principio de que las letras y los caracteres chinos se muestran según la información de la fuente, ¿cómo obtener la información de la fuente de los caracteres chinos? ¿Tenemos que hacerlo nosotros mismos? NO. Después de un arduo trabajo, los predecesores de DOS colocaron las fuentes producidas en bibliotecas estándar para evitar problemas de las generaciones futuras. Este es el archivo de fuentes de matriz de puntos. Generalmente, utilizamos una biblioteca de fuentes Song de matriz de puntos de 16 * 16. El llamado 16 * 16 significa que cada carácter chino se muestra en un área de 16 puntos vertical y horizontalmente. Sin embargo, más tarde aparecieron las fuentes HZK12, HZK24, HZK32 y HZK48, así como fuentes de cuerpo negro, escritura normal y fuentes de escritura oficiales. Aunque existen muchos tipos de bibliotecas de caracteres chinos, todas están organizadas por orden de ubicación. El primer byte es el código de área del carácter chino y el siguiente byte es el número de bit del carácter. Cada área registra 94 caracteres chinos y el número de bit es la posición del carácter en el área.
Por lo tanto, la fórmula de cálculo para la posición específica de los caracteres chinos en la biblioteca de caracteres chinos es: 94*(código de área-1)+número de dígito-1. Resta 1 porque la matriz comienza con 0 y el número del código de área comienza con 1. Esta es solo la posición del carácter chino en la biblioteca de caracteres chinos en unidades de caracteres chinos. Entonces, ¿cómo obtener la posición del carácter chino en la biblioteca de caracteres chinos en unidades de bytes? Simplemente multiplique por el número de bytes ocupados por una fuente de caracteres chinos, es decir: (94*(código de área-1)+número de dígito-1)*el número de bytes ocupados por una fuente de caracteres chinos y el tamaño de los caracteres chinos en cada biblioteca de caracteres chinos es diferente. Obtendrá resultados diferentes nuevamente. Tomando como ejemplo la fuente de matriz de puntos 16*16, la fórmula de cálculo es: (94*(código de área-1)+(número de bit-1))*32. Los 32 bytes de información que comienzan desde esta posición en la biblioteca de caracteres chinos registran la información de fuente del carácter.
☆Visualización de caracteres chinos de matriz de puntos
Después de comprender los principios de composición de los caracteres chinos de matriz de puntos y las bibliotecas de caracteres chinos, mostrar caracteres chinos se vuelve simple. Tomando como ejemplo la fuente de matriz de puntos de 16 * 16, el método habitual es: mover el puntero de trabajo del archivo a la fuente de caracteres chinos requerida, leer el archivo de la biblioteca de caracteres chinos en una matriz de 2 * 16 y luego usar un bucle for para mostrar poco a poco. Tomando el uso del modo VGAHI para mostrar la palabra "I" como ejemplo, el procedimiento es el siguiente:
#include "graphics.h"
#include "stdio.h "
main()
{
int i=VGA,j=VGAHI,k;
tapete de caracteres sin firmar[16] [2],chinease[3] ="I";
ARCHIVO *HZK;
if((HZK=fopen("hzk16","rb"))==NULL )salir(0); p>
initgraph(&i,&j,"");
i=chinease[0]-0xa0;j=chinease[1]-0xa0; Obtener código de área y código de bits*/
fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);
fread(mat ,32,1,HZK);
for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0 ;k<8;k++)
if(mat[j][i]&(0x80>>k)) /*Se mostrará el bit probado como 1* /
putpixel (i*8+k,j,WHITE);
getch();
closegraph();
fclose(HZK);
}
¿Qué te parece? Siempre que domines el método correcto, mostrar caracteres chinos no es complicado.
☆Imprima el archivo de fuente y HZK12
Si tiene HZK24S (fuente Song), HZK24K (fuente cursiva) o HZK24H (fuente Heold) de UCDOS, también puede usar caracteres chinos de fuente grande. en diferentes fuentes. La serie HZK24 es una fuente de matriz de puntos de 24*24 y cada fuente ocupa 3*24 bytes. Si sigues el método de visualización de HZK16, verás... jeje, las palabras están escritas. Esto se debe a que este tipo de biblioteca de fuentes es diferente de las bibliotecas de caracteres chinos comunes. Este tipo de biblioteca de caracteres chinos de fuentes grandes está especialmente diseñada para imprimir, las fuentes están al revés cuando las usa. Es necesario rotar la información de bits de las fuentes vertical y horizontalmente. Simplemente configure la visualización.
Por ejemplo, si lo define como mat[24][3], debería generarse así:
for(i=0;i<24;i++)
for(i=0;i<24;i++)
for (j=0;j <24;j++)
if((0x80>>i%8)&mat[j][i/8]) /*Transponer visualización*/
putpixel(j+ x,y+i,color);
También existe un tipo de fuente HZK12. Aunque es un tipo de fuente estándar, si calcula su fuente como 12*12 bits, será. No podrá mostrar caracteres chinos normalmente. Porque para facilitar el uso, el diseñador de fuentes ha agregado el número de dígitos en cada línea de la fuente a un múltiplo entero de 8, por lo que la longitud real de bits de la fuente es 16 * 12, aunque hay 4 dígitos más en cada una. línea, estos 4 Los bits son todos 0 (sin visualización), lo que no afecta el efecto de visualización.
☆La teoría está casi completa. Aquí hay un ejemplo práctico que escribí
/*
*Programa de demostración de visualización de caracteres chinos bajo TC
<. p> *LO JiyouVE 22:58 2005-5-23*Coloque el archivo hzk16 en el directorio de instalación de TC
*dirección de descarga del archivo hzk16
* Descargar archivo de fuente
*/
#include
#include
#define MAXX 640 /*Ancho de pantalla*/
#define MAXY 480 /*Alto de pantalla*/
#define WIDTH 20 /*Ancho de cada carácter chino*/
#define HIGH 20 /*Altura de cada carácter chino*/
int priChi(unsigned char * /*Función de impresión china, pasada en parámetros: valor de retorno del puntero de matriz chino -1, excepción 0, normal*/
int X=0; /*La variable global X Y controla el formato de impresión chino*/
int Y=0;
int main()
{
char Chinese[][60]={/*El compilador TC no admite líneas largas, por lo que la cadena china se almacena en formato bidimensional*/
"Me rindo. La noticia de que a la especialidad de Ciencias de la Computación de Tsinghua se le recomendó tomar el examen de ingreso a la universidad en lugar de que se le recomendó tomar el examen de ingreso a la universidad conmocionó a toda la escuela",
"Todos, desde el director con el director, con los profesores de varias materias, hablaron conmigo y me sorprendieron un poco sus cambios",
"Antes de ganar el primer premio y el premio especial en el Concurso Nacional de Información, parecía ser prescindible."
"La persona de repente se volvió tan popular que sentí como si mi cerebro nunca hubiera sido suficiente.",
"Es realmente interesante hablar sobre este premio especial. Aunque se llama final nacional, son solo unos bolígrafos.",
"Hagamos otra pregunta de prueba. El tiempo total para programar en la computadora es de tres horas. El idioma requerido es español o ". ,
" Pais se quedó estancado. Después de pasar media hora para completar el programa en dos idiomas, sentí que sentarme "," fue realmente una pérdida de mi gran juventud, así que decidí escribirlo nuevamente en lenguaje ensamblador.",
"Planeé usar diez microoperaciones. Estaba escrito en código hexadecimal, pero tuve que abandonarlo por cuestiones de tiempo. dijo ","
"El oro siempre brillará. Soy honesto y verdadero. Justo cuando me dedicaba a la programación con entusiasmo",
p>
"No No sabía que alguien me había notado durante mucho tiempo. Tres horas después, después de salir de la sala de examen, alguien",
"La persona rápidamente me agarró y gritó con entusiasmo: "Niños". El niño provocó directamente que me despertara con frecuencia de pesadillas varios años después",
" y también fue la causa directa de mi rechazo a la invitación de Tsinghua. Volvamos al tema de ",
<. p> "En la escena del incidente, me sorprendió y volví la cabeza hacia atrás. Un anciano delgado sostenía mi mano y sus ojos brillaban, y parecía mirarlo con un poco de afecto. Se me puso la piel de gallina. sobre mi cuerpo.","Los granos repentinamente salieron de mi cuerpo, y rápidamente estreché mis manos. El anciano pareció sentirlo.",
"Me moví. Aparté mis manos de una manera extraña. Dijo con un poco de vergüenza: "Niños, permítanme presentarme. Soy Ciencias de la Computación de la Universidad de Tsinghua".
"El director del Departamento de Ciencias de la Computación fue invitado a mirar. ",
"¿Entiendes lo que quiero decir? Esta frase tiene un gran impacto en la comprensión de los estudiantes de Tsinghua en mi mente."
"¿Crees que soy una persona respetable?" ¿Estás buscando talentos? Asentí y el anciano me miró.",
"Entiendo, se emocionó mucho y comenzó. para presentarme la experiencia práctica de la especialización en informática de Tsinghua.",
"Qué poderoso es, cuán influyente es a nivel nacional e incluso internacional, y finalmente lleno de sentimientos profundos",
"Me miró con cariño y me dijo seriamente que me daría la bienvenida en nombre de la carrera de informática de Tsinghua. Eso",
"
Mientras estudiaba, soporté sus escupitajos y con tacto le expresé que este asunto no era trivial y que tenía que volver a casa para discutirlo con mis padres y luego irme como si huyera. Por supuesto, el primer lugar al que fui fue el. Mi baño",
"cara, quién sabe si la saliva del viejo me dejará manchas de la edad en la cara. Volví a la escuela como regalo",
"Yo. Lo recibí después de despedirme. La noticia de la invitación oficial de Tsinghua se extendió rápidamente por toda la escuela a través de la boca de cuervo de mi director,
"y luego rápidamente llegó a oídos de mis padres a través de varios canales"};
if( -1 == priChi(chino))
{ /*Imprimir excepción*/
printf("Presione cualquier tecla para salir...");
fflush(stdin);
getch();
devuelve 1;
}
devuelve 0;
}
int priChi(unsigned char *chi)
{
unsigned char mat[16][2]; p>
int i=VGA,j=VGAHI,k;
int sec,pot;
ARCHIVO *HZK;
if((HZK =fopen("hzk16 ","rb"))==NULL) /*Abrir archivo de biblioteca de fuentes*/
{
printf("¡Error al abrir el archivo de estilo (hzk16)! \n");
return -1;
}
initgraph(&i,&j,"");
while( *chi) p>
{
sec = *chi-0xa0; /*Obtener el código de área*/
pot = *(chi+1)-0xa0 ; /*Obtener el código de bits */
fseek(HZK,(94*(sec-1)+(pot-1))*32l,SEEK_SET);
fread( mat,32,1,HZK );
for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k =0;k<8;k++)
if(mat[j][i] & (0x80 >> k)) /*Se mostrará el bit probado como 1 */
putpixel(X+i*8+k,Y+j,WHITE);
X += WIDTH; /*La abscisa del siguiente carácter*/ p>
if(X >= MAXX)
{
X = 0;
Y += HIGH /*Coordenada vertical del siguiente carácter; */
if(Y >= MAXY) /*Página completa*/
{
printf("pr
Presione cualquier tecla para imprimir otras palabras");
getch();
system("cls"); /*clear screen*/
Y = 0;
}
}
chi += 2; /*El puntero apunta al siguiente carácter chino*/
} p>
getchar();
closegraph();
fclose(HZK);
devuelve 0;
}