UTF-EBCDIC

UTF-EBCDIC es una codificación de caracteres que se utiliza para representar caracteres Unicode . Está diseñado para ser compatible con EBCDIC , de modo que las aplicaciones EBCDIC existentes en mainframes puedan aceptar y procesar caracteres sin mucha dificultad. Sus ventajas para los sistemas existentes basados ​​en EBCDIC son similares a las de UTF-8 para los sistemas basados ​​en ASCII. Los detalles sobre la transformación UTF-EBCDIC se definen en el Informe técnico de Unicode n. ° 16 ( UTR n. ° 16 ).

Transformación de un punto de código Unicode en una secuencia UTF-EBCDIC

Transformación intermedia UTF-8-Mod

Para producir la versión codificada en UTF-EBCDIC de una secuencia de puntos de código Unicode , primero se aplica una primera transformada intermedia, similar a UTF-8 (referida en las especificaciones como UTF-8-Mod ); La principal diferencia entre esta transformada intermedia y UTF-8 es que permite representar los puntos de código 0 + 0080 a U + 009F (los caracteres de control C1) en un solo byte y continuar usándolos como códigos de control EBCDIC.

Para lograr esto, se usó el patrón de bits 101xxxxx (que se muestra en las tablas siguientes en las celdas de fondo azul) en lugar de 10xxxxxx para representar los bytes finales de una secuencia multibyte que representa un solo punto de código. Dado que esto deja solo 5 bits significativos en lugar de 6 para los bytes finales, UTF-EBCDIC a menudo producirá un resultado un poco más largo que el obtenido con UTF-8, para los mismos datos de entrada. La transformación solo requiere operaciones binarias de enmascaramiento y desplazamiento bit a bit, y ninguna operación aritmética (a diferencia de lo que se necesita para la codificación UTF-16), por lo que es fácilmente invertible.

La transformación intermedia no puede producir ninguna secuencia de más de 6 bytes de valor hexadecimal entre A0 y BF y estos deben estar inmediatamente precedidos por un solo byte tomando un valor hexadecimal entre C4 y FF que marca el inicio y la longitud de una secuencia que representa un código. punto que abarca varios bytes. Los bytes de valor hexadecimal entre 00 y 9F no se modifican por la transformación y cada uno representa un solo carácter Unicode entre U + 0000 y U + 009F. Para la conversión de los puntos de código estándar de las normas actuales Unicode e ISO / IEC 10646: 2003, las secuencias producidas están limitadas a 1 byte inicial de valor hexadecimal entre 00 y FA, ​​seguido de un máximo de 4 bytes de valor hexadecimal entre A0 y BF.

Esta transformación no produce ninguna secuencia que contenga bytes de valor hexadecimal C0 a C3 o E0. Existen restricciones adicionales en los bytes de valor hexadecimal entre A0 y A7 que pueden no aparecer todos cuando se producen en la segunda posición después de un byte de valor hexadecimal inicial entre F0 y FC (consulte la tabla siguiente). Finalmente, los bytes de valor hexadecimal entre FB a FF tampoco se utilizan para la transformación de los puntos de código estándar de los estándares actuales Unicode e ISO / IEC 10646: 2003, sino solo para la transformación de los puntos de código antiguos del UCS-4. obsoleto que se definió en la antigua norma ISO 10646: 2000.

Definición de los patrones binarios de secuencias producidas por la transformación UTF-8-Mod intermedia
(incluyendo al final de la tabla las secuencias necesarias para la transformación de los puntos de código extendido del UCS-4 establecido en 31 bits, definidos en el antiguo norma ISO 10646: 2000 obsoleta)
Caracteres codificados Representación binaria UTF-8-Mod Secuencias de bytes válidas
(en hexadecimal)
Significado
1 st 2 nd 3 rd 4 º 5 º 6 º 7 º
U + 0000 hasta
U + 001F
0 xxxxxxx 00 a 1F - 1 byte, codificando 1 bit nulo y 7 bits variables (incluye caracteres de control C0 y el conjunto de gráficos latinos base invariante de ISO 646 y la versión estadounidense (ASCII) del conjunto de gráficos latinos base de ASCII (común también en ISO 8859-1) .
Nota: entre los 95 caracteres de la norma ISO 646 gráficos establecidos (codificado con el mismo valor escalar hexadecimal de 20 a 7E en las normas ISO 10646 y Unicode), uno de ellos (U + 0022) es invariante en la norma ISO 646 (pero varía sólo en la página de códigos turca de EBCDIC), otros 13 caracteres no forman parte del conjunto invariante de ISO 646 (corresponden aquí al conjunto ASCII americano y no a otro conjunto de una versión nacional de ISO 646) y también varían en EBCDIC páginas de códigos.
U + 0020 hasta
U + 007E
20 a 7E
U + 007F 7F
U + 0080 hasta
U + 009F
100 xxxxx 80 a 9F 1 byte, codifica 3 bits fijos y 5 bits variables (incluye caracteres de control C1, más comúnmente utilizados en sistemas que utilizan EBCDIC de forma nativa).
U + 00A0 a
U + 03FF
11 0 yyyyy 101 xxxxx C4 a DF A0 a BF - 2 bytes, codificando 1 bit nulo y 10 bits variables (incluye los caracteres latinos extendidos más comunes y la puntuación o símbolos, los diacríticos con o sin mayúsculas y minúsculas, así como los caracteres griegos y coptos más comunes).
Nota: El primer byte de la secuencia intermedia producida por la transformación UTF-8-Mod no puede tomar uno de los valores hexadecimales C0 a C3 porque el patrón binario yyyyy no debe ser menor que 00101 (los puntos de código correspondientes deben transformarse en secuencias más cortas arriba).
U + 0400 hasta
U + 3FFF
111 0 zzzz 101 yyyyy 101 xxxxx E1 a EF A0 a BF - 3 bytes, codificando 1 bit nulo y 14 bits variables (incluye los otros caracteres del primer trimestre del plan multilingüe básico, incluyendo los otros alfabetos modernos más comunes, abjads, abugidas o silabarios, así como símbolos y signos de moneda, caracteres menos extensiones comunes extendidas latinas y griegas y fonéticas).
Nota: el 1 st byte de la secuencia de intermedio producido por la transformación UTF-8-Mod no puede tomar el valor hexadecimal E0 porque el patrón binario zzzz no debe ser inferior a 0001 (los puntos de código correspondientes deben ser transformados en secuencias más cortas arriba).
U + 4000 a
U + 3FFFF
1111 0 www 101 zzzzz 101 aaaaa 101 xxxxx F0 A1 a BF A0 a BF - 4 bytes, codificando 1 bit cero y 18 bits variables (incluye el resto del plano multilingüe básico y los 3 primeros planos adicionales, incluyendo el plano multilingüe adicional y el plano ideográfico adicional).
Nota: cuando el 1 st byte de la secuencia de intermedio producido por la transformación UTF-8-Mod toma la F0 valor hexadecimal, la 2 nd byte de la secuencia no puede tomar el A0 valor hexadecimal porque el patrón binario www zzzzz no debe ser inferior a 000 10000 (los puntos de código correspondientes deben transformarse en secuencias más cortas arriba).
F1 a F7 A0 a BF
U + 40.000 a
U + 10FFFF
11111 0 rr 101 wwwww 101 zzzzz 101 yyyyy 101 xxxxx F8 A8 a BF A0 a BF - 5 bytes, codificando 1 bit nulo y 22 bits variables (incluye los últimos 13 planes estándar adicionales, incluidos los 2 últimos planes para uso privado, así como los primeros 47 planes extendidos ausentes de los estándares actuales ISO / IEC 10646: 2003 y Unicode pero definido en el conjunto UCS-4 del antiguo estándar ISO 10646: 2000).
Nota: cuando el 1 st byte de la secuencia de intermedio producido por la transformación UTF-8-Mod toma la F8 valor hexadecimal, la 2 nd byte de la secuencia no puede tomar uno de los valores hexadecimales A0 a A7 porque el patrón binario rr wwwww no debe ser menor que 00 01000 (los puntos de código correspondientes deben transformarse en secuencias más cortas arriba).
F9 A0 a BF
U-11FFFF a
U-3FFFFF
(FA) a (FB) A0 a BF
U-400000 a
U-3FFFFFF
111111 0 s 101 rrrrr 101 wwwww 101 zzzzz 101 yyyyy 101 xxxxx (FC) A4 a BF A0 a BF - 6 bytes, codificando 1 bit nulo y 26 bits variables (incluye otros 1007 planes extendidos ausentes de los estándares actuales ISO / IEC 10646: 2003 y Unicode pero definidos en el conjunto UCS-4 del antiguo estándar ISO 10646: 2000).
Nota: cuando el 1 st byte de la secuencia de intermedio producido por la transformación UTF-8-Mod toma el valor hexadecimal FC, la 2 nd byte de la secuencia no puede tomar uno de los valores hexadecimales A0 a A3 porque el patrón binario s rrrrr no debe ser menor que 0 00100 (los puntos de código correspondientes deben transformarse en secuencias más cortas arriba).
(FD) A0 a BF
U-4000000 a
U-7FFFFFFF
1111111 t 101 sssss 101 rrrrr 101 wwwww 101 zzzzz 101 yyyyy 101 xxxxx (FE) A2 a BF A0 a BF 7 bytes, codificando 31 bits variables (incluye los últimos 31,744 planes extendidos ausentes de los estándares actuales ISO / IEC 10646: 2003 y Unicode pero definidos en el conjunto UCS-4 del antiguo estándar ISO 10646: 2000).
Nota: cuando el 1 st byte de la secuencia de intermedio producido por la transformación UTF-8-Mod toma el valor hexadecimal FE, la 2 nd byte de la secuencia no puede tomar uno de los valores hexadecimales A0 a A1 debido a que el patrón binario t sssss no debe ser menor que 0 00010 (los puntos de código correspondientes deben transformarse en secuencias más cortas arriba).
(FF) A0 a BF

El informe técnico n ° 16 estipula que el resultado de esta primera transformación UTF-8-Mod no debe utilizarse para comunicaciones entre sistemas. Este uso está prohibido también porque es objeto de una patente que requiere una licencia de IBM (lo cual no es necesario aplicando la segunda transformación a continuación que, aunque esta combinación también está cubierta por esta patente, permite el uso libre sin requerir una licencia previa porque IBM ha concedido los derechos de uso).

Permutación final, compatible con la de convertir conjuntos ISO-8859 en un conjunto compatible con el conjunto EBCDIC invariante

La transformación intermedia deja los datos en un formato basado en ISO 8859 (por lo tanto también compatible con ISO 646 incluyendo ASCII, y con MIME), por lo que se realiza una transformación reversible de permutación de valores de bytes en las secuencias de bytes intermedios, en orden para acercarlos lo más posible al EBCDIC mediante la siguiente tabla de correspondencias (la misma tabla que permite transformar de forma reversible las codificaciones ISO 8859 en codificaciones compatibles con todas las posiciones invariantes de las codificaciones basadas en EBCDIC) .

Sin embargo, esto solo es posible para las posiciones invariantes del EBCDIC, la tabla de permutación se basa directamente en la transformación reversible de la versión estadounidense de ISO 646 (comúnmente llamada ASCII) en la versión estadounidense de EBCDIC, y la transformación estándar del control caracteres C0 (común entre ASCII, ISO8859 y EBCDIC) y C1 (común entre ISO 8859 y EBCDIC): el UTF-EBCDIC no define ni utiliza ninguna otra tabla de transformación para las otras versiones nacionales ISO 646 y EBCDIC (los cuadros de variantes amarillos a continuación , así como las casillas naranjas correspondientes al carácter "que está codificado 0x5A en la mayoría de variantes de EBCDIC pero varía en la variante turca, aunque 'es invariante y codificado en la posición 0x21 en todas las variantes estándar de ISO 646), ni para el la parte superior de los conjuntos ISO 8859 y la parte extendida del EBCDIC, cuyos caracteres varían en cada uno de los dos estándares (los recuadros a continuación, que se combinan manteniendo solo el orden relativo de los elementos del código en cada uno de los dos tipos de conjuntos de caracteres, para completar las permutaciones que faltan).

Correspondencia de bytes UTF-8-Mod a bytes UTF-EBCDIC

Alto cuarteto
Cuarteto bajo (todos los valores están en hexadecimal )
... 0 ... 1 ... 2 ... 3 ... 4 ... 5 ... 6 ... 7 ... 8 ... 9 ...A ... B ... VS ... D ... E ... F
0 ... 00 01 02 03 37 2D 2E 2 F dieciséis 05 15 0B 0C 0D 0E 0F
1 ... 10 11 12 13 3C 3d 32 26 18 19 3F 27 1 C 1D 1E 1F
2 ... 40 5A 7F 7B 5B 6C 50 7D 4D 5D 5C 4E 6B 60 4B 61
3 ... F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 7A 5E 4C 7E 6E 6F
4 ... 7C C1 C2 C3 C4 C5 C6 C7 C8 C9 D1 D2 D3 D4 D5 D6
5 ... D7 D8 D9 E2 E3 E4 E5 E6 E7 E8 E9 ANUNCIO E0 Historietas 5F 6D
6 ... 79 81 82 83 84 85 86 87 88 89 91 92 93 94 95 96
7 ... 97 98 99 A2 A3 A4 A LAS 5 A6 A7 A LAS 8 A9 C0 4F D0 A1 07
8 ... 20 21 22 23 24 25 06 17 28 29 2A 2B 2C 09 0A 1B
9 ... 30 31 1A 33 34 35 36 08 38 39 3A 3B 04 14 3E FF
A... 41 42 43 44 45 46 47 48 49 4A 51 52 53 54 55 56
B ... 57 58 59 62 63 64 sesenta y cinco 66 67 68 69 6A 70 71 72 73
VS ... (74) (75) (76) (77) (78) 80 8A 8B 8C 8D 8E 8F 90 9A 9B 9C
D ... 9D 9E 9F A0 Automóvil club británico AB C.A. AE AF B0 B1 B2 B3 B4 B5 B6
E ... (B7) B8 B9 licenciado en Letras cama y desayuno antes de Cristo SER BF ESO CB CC CD ESTO CF DA DB
F ... corriente continua DD DE DF E1 EA EB CE ED EE (EF) (FA) (PENSIÓN COMPLETA) (FC) (FD) (FE)

Notas:

  • los bytes de secuencia UTF-8-Mod 0xC0..0xC4 y 0xE0, así como los bytes de codificación UTF-EBCDIC correspondientes 0x74 ... 0x78 y 0xB7 no se utilizarán con las secuencias más cortas.
  • los bytes de secuencia UTF-8-Mod 0xFA..0xFF, así como los bytes de codificación UTF-EBCDIC correspondientes 0xEF y 0xFA ... 0xFE no se utilizarán para la codificación Unicode, sino solo para los puntos de código del UCS-4 del antiguo Norma ISO 10646: 2000, ampliada a 31 bits por punto de código (estos puntos de código UCS-4 tienen un valor superior a 0x10FFFF).

La tabla muestra en cursiva y pequeños caracteres entre paréntesis (sobre fondo verde oscuro) las entradas correspondientes, que no cumplen con los estándares actuales ISO 10646 y Unicode y por lo tanto no son interoperables.

Transformación inversa de UTF-8 a un punto de código Unicode

Estos dos pasos anteriores se pueden invertir fácilmente para encontrar los puntos de código Unicode.

Correspondencia de los bytes de la codificación UTF-EBCDIC en bytes de las secuencias invertibles UTF-8-Mod

Alto cuarteto
Cuarteto bajo (todos los valores están en hexadecimal )
... 0 ... 1 ... 2 ... 3 ... 4 ... 5 ... 6 ... 7 ... 8 ... 9 ...A ... B ... VS ... D ... E ... F
0 ... 00 01 02 03 9C 09 86 7F 97 8D 8E 0B 0C 0D 0E 0F
1 ... 10 11 12 13 9D 0A 08 87 18 19 92 8F 1 C 1D 1E 1F
2 ... 80 81 82 83 84 85 17 1B 88 89 8A 8B 8C 05 06 07
3 ... 90 91 dieciséis 93 94 95 96 04 98 99 9A 9B 14 15 9E 1A
4 ... 20 A0 A1 A2 A3 A4 A LAS 5 A6 A7 A LAS 8 A9 2E 3C 28 2B 7C
5 ... 26 Automóvil club británico AB C.A. ANUNCIO AE AF B0 B1 B2 21 24 2A 29 3B 5E
6 ... 2D 2 F B3 B4 B5 B6 B7 B8 B9 licenciado en Letras cama y desayuno 2C 25 5F 3E 3F
7 ... antes de Cristo Historietas SER BF (C0) (C1) (C2) (C3) (C4) 60 3A 23 40 27 3d 22
8 ... C5 61 62 63 64 sesenta y cinco 66 67 68 69 C6 C7 C8 C9 ESO CB
9 ... CC 6A 6B 6C 6D 6E 6F 70 71 72 CD ESTO CF D0 D1 D2
A... D3 7E 73 74 75 76 77 78 79 7A D4 D5 D6 5B D7 D8
B ... D9 DA DB corriente continua DD DE DF (E0) E1 E2 E3 E4 E5 5D E6 E7
VS ... 7B 41 42 43 44 45 46 47 48 49 E8 E9 EA EB CE ED
D ... 7D 4A 4B 4C 4D 4E 4F 50 51 52 EE EF F0 F1 F2 F3
E ... 5C F4 53 54 55 56 57 58 59 5A F5 F6 F7 F8 F9 (FA)
F ... 30 31 32 33 34 35 36 37 38 39 (PENSIÓN COMPLETA) (FC) (FD) (FE) (FF) 9F

Notas:

  • La tabla está organizada para que coincida exactamente con la codificación EBCDIC equivalente al conjunto de caracteres latinos base 95 de US-ASCII y 65 caracteres de control, que permanecen codificados en un solo byte:
    • sobre fondo rojo, 33 posiciones corresponden a los caracteres de control C0 del EBCDIC, también común a todos los conjuntos compatibles con ISO 646;
    • sobre un fondo violeta, 32 posiciones corresponden a los caracteres de control C1 del EBCDIC, también común a todos los conjuntos de ISO 8859;
    • sobre un fondo blanco, 81 posiciones corresponden a los caracteres gráficos que son invariantes en EBCDIC, comunes y también invariantes en ISO 646;
    • sobre fondo amarillo (o naranja), 14 posiciones corresponden a caracteres variantes en el EBCDIC, comunes a 13 posiciones variantes (y 1 posición invariante) en ISO 646, codificadas aquí para hacer coincidir la variante estadounidense del EBCDIC con la variante estadounidense US-ASCII de ISO 646.
  • Las otras 96 posiciones corresponden a caracteres variables según los distintos conjuntos ISO 8859 y EBCDIC. Estas posiciones se utilizan para codificar en UTF-EBCDIC los caracteres estándar de los conjuntos Unicode e ISO 10646 y que no son ninguno de los caracteres gráficos del US-ASCII, ni ninguno de los caracteres de control C0 y C1:
    • sobre fondo azul, 32 posiciones corresponden a elementos de código de cola, siempre colocadas después de un código de prefijo único y en número variable;
    • sobre un fondo verde, 64 posiciones corresponden a puntos de código de prefijo que también determinan, en función de su valor, la longitud de las secuencias de puntos de código utilizadas y que normalmente siempre van seguidas de uno o más puntos de código de cola.
    • Entre estas últimas posiciones, la tabla muestra en cursiva, caracteres pequeños y entre paréntesis (sobre fondo verde oscuro) las 10 entradas correspondientes a los puntos de código prefijo ahora no utilizados por UTF-EBCDIC para la codificación estandarizada para intercambios interoperables entre sistemas:
    • los 5 bytes de las secuencias UTF-8-Mod 0xC0..0xC4 y 0xE0, así como los 5 códigos UTF-EBCDIC correspondientes 0x74 ... 0x78 y 0xB7 están reservados: no deben usarse para codificar ninguno de los caracteres en UTF -EBCDIC el estándar Unicode común a los caracteres del estándar ISO 10646 actual (las secuencias de puntos de código UTF-ETCDIC deben ser lo más cortas posible);
    • los 5 bytes de las secuencias UTF-8-Mod 0xFA..0xFF, así como los 5 códigos UTF-EBCDIC correspondientes 0xEF y 0xFA ... 0xFE ahora están reservados: ya no deberían usarse para codificar ninguno de los caracteres en UTF -EBCDIC del estándar Unicode o del estándar ISO 10646 actual, pero solo para codificar en UTF-EBCDIC los puntos de código antiguo (denotados U-110000 a U-7FFFFFF) del obsoleto conjunto UCS-4 del antiguo ISO 10646: 2000 estándar (que luego extendió los valores escalares de puntos de código válidos en este conjunto a 31 bits).

Detección de bytes iniciales en textos que contienen secuencias UTF-EBCDIC

Indicadores de longitud de secuencia asociados con octetos codificados en UTF-EBCDIC

Alto cuarteto
Cuarteto bajo (todos los valores están en hexadecimal )
... 0 ... 1 ... 2 ... 3 ... 4 ... 5 ... 6 ... 7 ... 8 ... 9 ...A ... B ... VS ... D ... E ... F
0 ... 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 ... 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 ... 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 ... 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 ... 1 1 1 1 1 1
5 ... 1 1 1 1 1 1 1
6 ... 1 1 1 1 1 1 1
7 ... (2) (2) (2) (2) (2) 1 1 1 1 1 1 1
8 ... 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2
9 ... 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2
A... 2 1 1 1 1 1 1 1 1 1 2 2 2 1 2 2
B ... 2 2 2 2 2 2 2 (3) 3 3 3 3 3 1 3 3
VS ... 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3
D ... 1 1 1 1 1 1 1 1 1 1 3 3 4 4 4 4
E ... 1 4 1 1 1 1 1 1 1 1 4 4 4 5 5 (5)
F ... 1 1 1 1 1 1 1 1 1 1 (5) (6) (6) (7) (7) 0
Leyenda
0 Carácter de control C0 representado en 1 byte
0 Carácter de control C1 representado en 1 byte
1 Carácter gráfico que varía en ISO 646 o EBCDIC representado en 1 byte
1 Carácter gráfico invariante en ISO 646 pero variable en EBCDIC representado en 1 byte
1 Carácter gráfico invariante de ISO 646 y EBCDIC representado en 1 byte
(2) Primer byte de una secuencia de 2 bytes no estándar que puede representar un valor tomado de un conjunto de hasta 160 elementos (ver nota 1)
2 Primer byte de una secuencia UTF-EBCDIC codificada de 2 bytes que representa un punto de código de U + 00A0 a U + 03FF
(3) Primer byte de una secuencia de 3 bytes no estándar que puede representar un valor tomado de un conjunto de hasta 1024 elementos (ver nota 1)
3 Primer byte de una secuencia UTF-EBCDIC de 3 bytes que representa un punto de código de U + 400 a U + 3FFF
4 Primer byte de una secuencia UTF-EBCDIC codificada en 4 bytes que representa un punto de código de U + 4000 a U + 3FFFF (estos puntos de código incluyen los del plano multilingüe básico y los de los tres primeros planos adicionales comunes a los estándares Unicode e ISO 10646)
5 Primer byte de una secuencia UTF-EBCDIC de 5 bytes que representa un punto de código de U + 40000 a U + 10FFFF (estos puntos de código incluyen los de los otros trece planos adicionales comunes al estándar Unicode y la versión actual de ISO 10646)
(5) Primer byte de una secuencia UTF-EBCDIC de 5 bytes que representa un punto de código extendido del antiguo estándar ISO 10646: 2000 (ver nota 2)
(6) Primer byte de una secuencia UTF-EBCDIC de 6 bytes que representa un punto de código extendido del antiguo estándar ISO 10646: 2000 (ver nota 2)
(7) Primer byte de una secuencia UTF-EBCDIC de 7 bytes que representa un punto de código extendido del antiguo estándar ISO 10646: 2000 (ver nota 2)
Byte final de un carácter codificado en varios bytes, cada uno de los cuales representa un grupo de 5 bits (codificándolos en el orden de los bits más significativos al bit más bajo) en el valor escalar del punto de código.

Notas:

  1. los bytes de secuencia UTF-8-Mod 0xC0..0xC4 y 0xE0 (así como los bytes UTF-EBCDIC correspondientes 0x74 ... 0x78 y 0xB7) no se deben utilizar porque no prefieren las secuencias más cortas; dichas secuencias no representan ningún carácter ni siquiera ningún punto de código en las normas ISO 10646 y Unicode, sino solo valores escalares en otros conjuntos indefinidos y cuyo uso no es correcto si aparecen en un texto supuestamente codificado de acuerdo con UTF-EBCDIC .
  2. Los bytes de secuencia UTF-8-Mod 0xFA..0xFF (así como los bytes UTF-EBCDIC correspondientes 0xEF y 0xFA ... 0xFE) no deben usarse para codificar puntos de código estándar del texto de acuerdo con los estándares Unicode actuales o ISO 10646, pero solo para representar los puntos de código extendidos UCS-4 del antiguo estándar ISO 10646: 2000, extendido a 31 bits por punto de código (estos puntos de código extendidos UCS-4 tienen un valor escalar mayor que 0x10FFFF).

La tabla muestra en cursiva y caracteres pequeños entre paréntesis -  (2) , (3) y de (5) a (9) sobre un fondo verde oscuro - las entradas correspondientes que no se ajustan a las normas actuales ISO 10646 y Unicode, por lo tanto no interoperables: su uso solo puede ser local y privado, y las secuencias que contienen estos bytes no deben intercambiarse con otros sistemas en los que comúnmente se considerarán no válidos.

Por lo tanto, la tabla de banderas efectiva (utilizando una definición que se ajuste estrictamente a los estándares interoperables actuales) puede contener un número menor de valores (entre 0 y 5 en la tabla anterior para las banderas de bytes de encabezado estándar, así como un valor indicado por una viñeta). • en la tabla anterior, pero que puede ser reemplazado por 6 para indicar los bytes de cola, el valor 7 también permanece utilizable para indicar todas las posiciones que no se ajustan a los estándares actuales, lo que permite codificar las entradas de los 3 bits tabla de banderas).

Un defecto de UTF-EBCDIC es que no es fácil de detectar, en un texto codificado en UTF-EBCDIC, qué bytes delimitan cada secuencia.

De hecho, están dispersos entre los 256 valores posibles (consulte las 32 posiciones marcadas en azul en las tablas de arriba para codificar los bytes de cola que siguen a uno de los 32 bytes diferentes en las posiciones marcadas en verde que indican el inicio y la longitud . de una secuencia UTF-EBCDIC), y la técnica actual requiere una tabla de correspondencia que permita saber si un byte aislado representa un carácter (excepto para los códigos de control C0 y C1 agrupados entre 0x00 y 0x3F o el carácter de cancelación (DEL) codificado 0xFF en todas las versiones del EBCDIC), o si es un byte final o un byte inicial que indica la longitud efectiva de la secuencia.

Esta tabla de correspondencia se describe en el Informe Técnico No. 16 y contiene indicadores ( indicadores de sombra ) para cada valor de byte posible. Su costo algorítmico y en términos de rendimiento no es despreciable y, en última instancia, similar al de la tabla de permutación utilizada en el segundo paso de transformación de UTF-EBCDIC. Su interés sigue siendo muy limitado en términos de rendimiento, ya que aún es necesario especializar los bytes finales (todos identificados por la misma bandera porque no podemos conocer su posición relativa en la secuencia solo a partir de su valor de un solo byte) y proceder a lecturas adicionales y bucles de prueba para encontrar el primer byte de la secuencia.

Además, muchas implementaciones de UTF-EBCDIC se satisfacen solo con la tabla de permutación inversa de UTF-EBCDIC a UTF-8-Mod (presentada en la sección anterior) y prescinden de la tabla de banderas. Luego, realizan una prueba de valor simple en el valor de byte intermedio de UTF-8-Mod devuelto por esta tabla de permutación inversa, sabiendo que en UTF-8-Mod, todos los bytes de cola obedecen la condición muy simple de probar (escrito aquí en C , C ++ , Java o C # sintaxis ):

(byte y 0xE0) == 0xA0

Utilizando UTF-EBCDIC

Por lo general, esta codificación rara vez se utiliza, incluso en mainframes basados en EBCDIC para los que se diseñó esta codificación. Los sistemas de mainframe basados ​​en EBCDIC de IBM , como z / OS o MVS , en la actualidad suelen utilizar UTF-16 para el soporte completo de Unicode: por ejemplo, DB2 UDB, COBOL, PL / I, Java e IBM Toolkit for XML todos admiten UTF-16 en Sistemas IBM.

Extensión de 32 bits para uso interno

La transformación UTF-EBCDIC a veces se puede extender para facilitar el procesamiento interno, considerando que las secuencias UTF-EBCDIC limitadas a 4 bytes pueden codificar cualquier punto de código hasta el final del plano suplementario # 3 (es decir, digamos hasta U + 3FFFF). Por lo tanto, es posible representar (solo internamente) todos los puntos de código del plan multilingüe básico en una forma comparable a UTF-16, al representar también los códigos de media área ( sustitutos ) de UTF-16. A continuación, se obtiene fácilmente un punto de código de 32 bits, que sigue siendo compatible con el EBCDIC para cada punto de código del BMP, y dos puntos de código de 32 bits cada uno para representar los puntos de código de los planos adicionales.

Esta representación alternativa no debe usarse en intercambios entre sistemas, sino solo para facilitar y optimizar interfaces de programación internas donde los caracteres EBCDIC se intercambian en puntos de código de 32 bits (en memoria), lo que luego limita el número de pruebas. De valores y evita el uso sistemático de tablas de permutación para probar rangos de caracteres durante el procesamiento complejo o voluminoso de textos (el uso sistemático de tablas de permutación es una operación costosa en términos de rendimiento, en comparación con una prueba simple basada en intervalos de valores de puntos de código de 32 bits).

Actualmente, esta representación interna no tiene un nombre oficial bien definido, incluso si algunos lo llaman UTF-16-Mod o UTF-16-EBCDIC (nombres incorrectos porque esta transformación crea puntos de código de 32 bits, cada uno de los cuales representa un punto de código de 16 bits del UCS- 2 ).

Su ventaja con respecto a la representación intermedia UTF-8-Mod es que es posible evitar el uso de cualquier tabla para saber si un punto de código es el primero de una secuencia o uno de los puntos de código finales. De hecho, los puntos de código de las medias zonas de UTF-16 (que permiten saber si un punto de código es el primero o el segundo de una secuencia) también se representan en intervalos contiguos de puntos de código en 32 bits en esta representación, lo que facilita su detección mediante una prueba aritmética únicamente y que permite saber si un punto de código de 32 bits es el primero o el segundo que representa un punto de código adicional, o si el punto de código de 32 bits está aislado y representa un punto de código del BMP. Por otro lado, esta representación interna también conserva los valores de todos los caracteres EBCDIC invariantes.

Sin embargo, transformar una secuencia UTF-EBCDIC en esta representación interna de 32 bits requiere saber qué bytes delimitan una secuencia UTF-EBCDIC, lo que requiere una tabla de banderas (llamada mostrar banderas ) para interpretar correctamente UTF-EBCDIC. Pero lo contrario es inmediato y no requiere ninguna tabla (la transformación inversa se realiza mediante simples cambios binarios y pruebas de los valores nulos para saber si uno o más bytes deben transmitirse en el UTF-EBCDIC.

Si el almacenamiento no es importante y se refiere solo a cantidades limitadas de caracteres, esta representación será más rápida (por ejemplo, como paso intermedio para transformar un texto UTF-EBCDIC en mayúsculas cuando se tienen tablas o algoritmos basados ​​en l 'EBCDIC, o como un paso intermedio en el cálculo de claves de intercalación basadas en EBCDIC o UTF-EBCDIC, o internamente en analizadores léxicos procesando textos codificados en EBCDIC o UTF-EBCDIC).

Por otro lado, su principal inconveniente es obviamente su tamaño, el doble que el de UTF-16 (razón por la cual las bases de datos prefieren indexar o almacenar textos y claves de búsqueda utilizando el más compacto UTF-16).

Ver también

Vínculos internos

enlaces externos