Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Por qué los comentarios del código vc6.0 se volvieron así?

¿Por qué los comentarios del código vc6.0 se volvieron así?

Problema de codificación: debido a las diferentes formas de codificación, los resultados del reconocimiento son diferentes.

Por ejemplo: el comentario está en chino, pero la codificación se cambia a UT8 u otras formas, lo que genera esta situación.

Cambiar la codificación a veces la restaura, a veces no.

Encontrar características de codificación comunes es la base para resolver problemas de codificación de juegos de caracteres. La identificación y conversión de la codificación del juego de caracteres, el análisis de las causas de varios caracteres confusos y la programación de varias cadenas codificadas (como el recuento de caracteres, el truncamiento), etc., requieren una aclaración de las características de la codificación.

Comprender la codificación del juego de caracteres consiste principalmente en comprender la relación entre el rango de codificación del código, el código correspondiente al juego de caracteres (qué caracteres están incluidos) y otras codificaciones del juego de caracteres.

ASCII

ASCII es una codificación de 7 bits con un rango de codificación de 0x00-0x7F. El conjunto de caracteres ASCII consta de letras inglesas, números arábigos y signos de puntuación. Estos incluyen los caracteres de control 0x00-0x20 y 0x7F***33.

Los sistemas que sólo soportan ASCII ignoran el bit más alto de cada byte y consideran sólo los 7 bits inferiores como válidos. Al principio, muchos sistemas de correo electrónico solo admitían ASCII, por lo que para transmitir correo electrónico chino había que utilizar BASE64 u otro método de codificación.

GB2312

GB2312 se basa en el código de área. Divide la tabla de codificación en 94 áreas. Cada área corresponde a 94 bits de la combinación del código de área y el número de bits de cada una. El carácter es un código de área chino. La combinación del código de área y el número de bit de cada carácter es el código de área del carácter chino. El código de área generalmente se representa mediante un número decimal. Por ejemplo, 1601 representa 1 dígito del área 16 y el carácter correspondiente es "ah". Agregue 0xA0 después del código de área y el número de bit para obtener el código GB2312.

El área 01-09 del código de área es el área de símbolos y números, el área 16-87 es el área de caracteres chinos y el 10-15 y 88-94 son áreas en blanco no definidas. Divide los caracteres chinos recopilados en dos niveles: el primer nivel son los caracteres chinos de uso común, un total de 3755, colocados en las áreas 16-55, ordenados en el orden de letras/trazos chinos Pinyin; el segundo nivel son los caracteres chinos poco comunes; un total de 3.008, colocados en las áreas 56-87, ordenados en orden radical/trazo. Los caracteres chinos de primer nivel están ordenados según pinyin, por lo que se puede obtener un cierto rango de pinyin a partir de caracteres chinos de primer nivel. Muchos programas que pueden obtener pinyin basados ​​​​en caracteres chinos están escritos de acuerdo con este principio.

Además de los caracteres chinos simplificados de uso común, el conjunto de caracteres GB2312 también incluye letras griegas, hiragana y katakana japoneses, letras cirílicas rusas, etc. No incluye caracteres chinos tradicionales ni algunos caracteres raros. Puede utilizar caracteres chinos tradicionales para comprobar si algunos sistemas solo admiten la codificación GB2312.

El rango de codificación de GB2312 es 0xA1A1-0x7E7E. Después de eliminar el área no definida, se puede entender que el rango de codificación real es 0xA1A1-0xF7FE.

EUC-CN puede entenderse como un alias de GB2312, que es exactamente igual a GB2312.

Un código de región se parece más a una definición de juego de caracteres, que define los caracteres y sus posiciones, mientras que GB2312 y EUC-CN son codificaciones que admiten ese juego de caracteres en un entorno informático real. HZ e ISO-2022-CN son otras dos codificaciones correspondientes al conjunto de caracteres del código de región y ambas admiten caracteres chinos en el espacio de codificación de 7 bits. La relación entre los códigos de región y la codificación GB2312 es un poco como la relación entre Unicode y UTF-8.

GBK

La codificación GBK es un superconjunto de la codificación GB2312 y es totalmente compatible con GB2312. Al mismo tiempo, GBK contiene todos los caracteres chinos, japoneses y coreanos en el multilingüe básico Unicode. avión.

Al igual que GB2312, GBK admite caracteres griegos, kana japoneses y rusos, pero no admite caracteres fonéticos coreanos (caracteres no chinos) e incluye caracteres como radicales chinos y signos de puntuación verticales que no están incluidos en GB2312.

El rango de codificación general de GBK es 0x8140-0xFEFE, excluyendo combinaciones con un byte bajo de 0×7F. El rango de bytes alto es 0x81-0xFE y el rango de bytes bajo es 0x40-7E y 0x80-0xFE.

Los caracteres GBK cuyo byte bajo es 0x40-0x7E son algo especiales porque estos caracteres ocupan posiciones ASCII y pueden causar problemas en algunos sistemas.

Algunos sistemas utilizan caracteres en 0x40-0x7E (como "|") para crear símbolos especiales y, al ubicar estos símbolos, no determinan si pertenecen al byte bajo de un carácter GBK específico. lo que puede conducir a un juicio equivocado. En un entorno que admita GB2312, este problema no existe. Cabe señalar que en el entorno GBK, los bytes menores que 0x80 no son necesariamente símbolos ASCII. Además, es mejor usar símbolos ASCII menores que 0x40 para crear algunos símbolos especiales, de modo que pueda ubicarlos rápidamente sin preocuparse; sobre otros personajes.

CP936 y GBK son ligeramente diferentes; en la mayoría de los casos puedes usar CP936 como alias para GBK.

GB18030

GB18030 es compatible con versiones anteriores de GBK y GB2312, lo que significa que no solo los caracteres son compatibles, sino que la codificación de los mismos caracteres también es la misma. GB18030 contiene todos los caracteres en Unicode 3.1, incluidos los caracteres minoritarios chinos, los caracteres coreanos no admitidos por GBK, etc. También se puede decir que se incluyen personajes de la mayoría de grupos étnicos del mundo.

GBK y GB2312 son codificaciones de doble byte de igual ancho. Si se incluye soporte compatible con ASCII y de un solo byte, también pueden entenderse como una mezcla de longitud variable de un solo byte y de doble byte. codificaciones.

El rango de codificación de un solo byte de GB18030 es 0x00-0x7F, que es completamente equivalente a ASCII. El rango de codificación de doble byte es el mismo que el de GBK, el byte alto es 0x81-0xFE y el byte bajo. el rango de codificación de bytes es 0x40-0x7E y 0x80-FE; el rango de codificación de cuatro bytes de los primeros tres bytes es 0x81-0xFE, el rango de codificación de cuatro bytes del segundo, tercer y cuarto bytes es 0x81-0xFE y el El rango de codificación de cuatro bytes del segundo y cuarto bytes es 0x81-0xFE. El rango de codificación de cuatro bytes es 0x30-0x39.

La página de códigos CP936 en Windows usa 0x80 para representar el símbolo del euro, mientras que la codificación GB18030 no usa los bits de codificación 0x80, sino que usa otras posiciones para representar el símbolo del euro. Esto se puede explicar porque hay un pequeño problema con la compatibilidad con versiones anteriores de GB18030. También se puede explicar que 0x80 es una extensión de CP936 a GBK, mientras que GB18030 solo es compatible con GBK.

BIG5

Big5 es una codificación de doble byte. El rango de codificación de bytes altos es 0x81-0xFE y el rango de codificación de bytes bajos es 0x40-0x7E y 0xA1-0xFE. En comparación con GBK, la combinación 0x80-0xA0 falta en los bytes bajos y 0x8140-0xA0FE es un área reservada para áreas de caracteres creadas por el usuario.

Big5 solo incluye caracteres chinos tradicionales, no caracteres chinos simplificados, y algunos caracteres chinos raros no están incluidos. GBK contiene caracteres japoneses Kana, y tampoco el carácter ruso Big5.

Dado que la cantidad de caracteres en Big5 es limitada, muchos códigos se extienden sobre la base de Big5, como el sistema chino Yitian. La página de códigos CP950 utilizada en Windows también puede entenderse como una extensión de Big5, agregando 7 caracteres sobre la base. De los caracteres Big5 y algunos símbolos, el juego de caracteres correspondiente al código Big5 es un subconjunto del juego de caracteres GBK, lo que significa que los caracteres contenidos en Big5 son los mismos que los caracteres contenidos en GBK. Los caracteres contenidos en Big5 son parte de los caracteres contenidos en GBK, pero los mismos caracteres están codificados de manera diferente.

Dado que Big5 también ocupa espacio de codificación ASCII (se usa 0x40-0x7E para bytes bajos), la codificación Big5 tiene el mismo problema que la codificación GBK en algunos entornos, es decir, los bytes bajos están en el rango de 0x40. -0x7E Los caracteres incluidos pueden estar mal manejados, especialmente los caracteres con byte bajo 0x5C ("/") y 0x7C ("|"). Consulte la sección GBK para obtener las instrucciones correspondientes.

Aunque existen algunas diferencias, en su mayor parte el CP950 puede considerarse un alias del Big5.

ISO-8859-1

La codificación ISO-8859-1 es una codificación de un solo byte que es compatible con versiones anteriores de ASCII. Su rango de codificación es 0x00-0xFF, donde 0x00-0x7F. Exactamente consistente con ASCII, 0x80-0x9F son caracteres de control y 0xA0-0xFF son símbolos de texto.

ISO-8859-1 contiene caracteres que, además de los contenidos en ASCII, incluyen símbolos de texto correspondientes a idiomas de Europa occidental, griego, tailandés, árabe y hebreo. El símbolo del euro apareció más tarde y no se incluyó en la norma ISO-8859-1.

Debido a que el rango de codificación ISO-8859-1 utiliza todo el espacio dentro de un solo byte, ningún otro byte de codificación no se descarta cuando se transmite y almacena en sistemas que admiten el flujo ISO-8859-1. En otras palabras, no hay ningún problema en tratar cualquier otro flujo de bytes de codificación como codificación ISO-8859-1. La codificación predeterminada de la base de datos MySQL es Latin1, que aprovecha esta importante característica. La codificación ASCII es un contenedor de 7 bits, mientras que la codificación ISO-8859-1 es un contenedor de 8 bits.

Latin1 es un alias de ISO-8859-1, escrito como Latin-1 en algunos entornos.

UCS-2 y UTF-16

Tanto la organización Unicode como la organización ISO están intentando definir un conjunto de caracteres muy grande que contendrá también todos los caracteres utilizados en todos los idiomas. como otras disciplinas Algunos caracteres especiales utilizados en el Conjunto de Caracteres Universal (UCS). Las dos organizaciones coordinaron su desarrollo, pero los puestos de carácter definidos son los mismos y la norma ISO correspondiente es la ISO 10646. Tanto Unicode como ISO 10646 están en constante evolución, por lo que existen diferentes números de versión para representar diferentes etapas de desarrollo, y cada número de versión Unicode se puede encontrar en el número de versión ISO 10646 correspondiente. Cada número de versión Unicode se puede encontrar en el número de versión ISO 10646 correspondiente.

El estándar ISO 10646 define un juego de caracteres de 31 bits. Los primeros dos bytes (0x0000-0xFFFD) se denominan plano multilingüe básico (BMP), y el rango posterior se denomina plano auxiliar, que incluye la mayoría de los caracteres para todos los idiomas, por lo que, siempre que admita BMP, podrá admitir la mayoría. aplicaciones en la mayoría de situaciones. 3.0 es equivalente a un conjunto de caracteres para todo BMP.

El juego de caracteres UCS especifica una posición para cada carácter, generalmente usando "U" más el número hexadecimal de la posición del carácter en UCS como la representación UCS del carácter, por ejemplo, "U 0041" representa Carácter "A". Los caracteres UCS de "U 0000" a "U 00FF" son los mismos que ISO-8859-1.

UCS-2 y UTF-16 son conjuntos de caracteres UCS (o conjuntos de caracteres Unicode) en aplicaciones prácticas de modos de codificación específicos. UCS-2 es una codificación de doble byte de igual ancho. Debido a que solo se pueden usar dos bytes de espacio de codificación, solo puede codificar caracteres en BMP. UTF-16 es una codificación de longitud variable. El BMP de dos bytes contiene codificación de caracteres y el BMP de cuatro bytes contiene codificación de caracteres. UTF-16 es una codificación de longitud variable que utiliza dos bytes para codificar caracteres dentro del BMP y cuatro bytes para codificar caracteres en el plano auxiliar fuera del BMP.

UCS-2 se diferencia de GBK y Big5 en que es una codificación verdadera de igual ancho que utiliza dos bytes por carácter. Esta característica es muy útil al truncar cadenas y contar caracteres.

UTF-16 es un superconjunto de UCS-2. La codificación de doble byte de UTF-16 es exactamente la misma que la de UCS-2, lo que significa que dentro del marco BMP, UCS-2 es exactamente la misma. Lo mismo que UTF-16, y UTF-16 a menudo se denomina alias de UCS-2.

UCS-2 y UTF-16 utilizan dos órdenes de bytes diferentes (big endian y little endian) para el almacenamiento y la transmisión. Por ejemplo, "ah" (U 554A) es 0x554A en la especificación grande y 0x4A55 en la especificación pequeña. Para indicar el orden de los bytes durante la transmisión, se debe agregar una BOM (marca de orden de bytes) delante del flujo de bytes, 0xFEFF representa el bit big-endian y 0xFFFE representa el bit little-endian. UCS-2BE y UCS-2LE son los nombres de codificación utilizados en aplicaciones prácticas, correspondientes a bits big-endian y bits little-endian respectivamente. UTF-16 es el nombre de codificación utilizado en aplicaciones prácticas. UCS-2BE y UCS-2LE son nombres de codificación utilizados en aplicaciones prácticas, correspondientes a bits big-endian y bits little-endian, así como UTF-16BE y UTF-16LE respectivamente. Dado que el orden de bytes predeterminado es BE, puede considerar UCS-2 como un alias de UCS-2BE.

Hay un carácter llamado "ESPACIO SIN INTERRUPCIÓN DE ANCHO CERO" en la codificación UCS, cuya codificación es U FEFF, que es un carácter sin significado práctico. La especificación UCS recomienda que el carácter "ESPACIO SIN INTERRUPCIÓN DE ANCHO CERO" se transmita antes de transmitir el flujo de bytes.

UCS-2 y UTF-16 también se pueden interpretar de la misma manera que ASCII e ISO-8859-1. Agregue 0x00 a cada byte de la codificación ASCII o ISO-8859-1 para obtener el UCS correspondiente. -2 codificación del personaje.

UCS-2 y UTF-16 usan 0x00 como parte de una codificación de caracteres específica. Algunos sistemas usan 0x00 como final de una cadena, lo que puede causar problemas al trabajar con la codificación UCS-2 o UTF-16. .

UTF-8

UTF-8 es otra codificación del juego de caracteres UCS. En UTF-16, cada unidad tiene dos bytes (16 bits), y en UTF-8. hay un byte (8 bits) por unidad. En UTF-16, se utilizan uno o dos bytes dobles para representar un carácter, mientras que en UTF-8, se utilizan uno o varios bytes individuales para representar un carácter.

Se puede considerar que la codificación UTF-8 se convierte de UCS-2 según un patrón determinado. La relación de conversión de UCS-2 a UTF-8 es la siguiente:

. UCS-2 UTF-8

U 0000 - U 007F 0xxxxxxx

U 0080 - U 07FF 110xxxxxxx 10xxxxxx

U 0800 - U FFFF 1110xxxxx 10xxxxxxx 10xxxxxxx

Por ejemplo, la codificación UCS-2 de la palabra "ah" es 0x554A, que corresponde al binario 0101 0101 0100 1010. Después de convertir 0100 1010 a UTF-8, el binario es 1110 0101 10 010101 10 001010 y el hexadecimal correspondiente es 0xE5958A.

UCS-4 también es un método de codificación del juego de caracteres UCS. Es una codificación de igual ancho de 4 bytes que se puede utilizar para representar caracteres auxiliares distintos de BMP. Agregue 0x0000 antes de cada dos bytes de UCS-2 para obtener la codificación UCS-4 de caracteres BMP.

Según el modo de generación de UTF-8 y las características del juego de caracteres UCS, se puede observar que UTF-8 tiene las siguientes características:

UTF-8 es completamente compatible con ASCII, lo que significa que es totalmente compatible con ASCII. Los caracteres correspondientes a los caracteres ASCII se pueden usar en UTF-8 y los caracteres correspondientes a los caracteres UCS se pueden usar en UTF-8. Es decir, los caracteres correspondientes en UTF-8 son exactamente los mismos que los de ASCII. Los caracteres en el rango 0x00-0x7F deben ser caracteres ASCII y no pueden formar parte de ningún otro carácter. Los fallos que existen tanto en GBK como en Big5 no existen en UTF-8.

En la codificación UTF-8, los caracteres UCS mayores que U 007F tienen al menos dos bytes.

El primer byte de cada carácter codificado en UTF-8 siempre está entre 0x00-0xFD (independientemente del soporte de UCS-4, el primer byte está entre 0x00-0xEF). Con base en el primer byte, puede determinar cuántos bytes consecutivos le siguen.

Todos menos el primer byte están entre 0x80-0xBF; 0xFE y 0xFF no se utilizan en UTF-8.

El rango de caracteres chinos en codificación GBK en UCS-2 está entre U 0800 - U FFFF, por lo que la codificación UTF-8 de cada carácter chino en codificación GBK es de 3 bytes. Pero la codificación UTF-8 de otros caracteres incluidos en GBK no es necesariamente de 3 bytes, como los caracteres rusos en GBK.

Incluso si se pierde un byte durante la transmisión de la codificación UTF-8, es fácil encontrar la ubicación del byte perdido de acuerdo con las reglas de codificación y otros caracteres no se verán afectados. En otras codificaciones de doble byte, una vez que se pierde un byte, todos los caracteres posteriores a ese byte se ven afectados. Se puede ver que la codificación UTF-8 es muy adecuada para la codificación de transferencia