Shift JIS (también SJIS , nombre MIME Shift_JIS , conocido como PCK en contextos Solaris ) [2] [3] es una codificación de caracteres para el idioma japonés , desarrollada originalmente por la empresa japonesa ASCII Corporation [b] en conjunto con Microsoft y estandarizada como JIS X 0208 Apéndice 1 .
Shift JIS se basa en conjuntos de caracteres definidos en los estándares JIS X 0201 :1997 (para caracteres de un solo byte ) y JIS X 0208 :1997 (para caracteres de doble byte ).
En octubre de 2024 [actualizar], el 0,3 % de las páginas web encuestadas utilizaban Shift JIS (en realidad decodificado como su superconjunto de codificación Windows-31J ), una disminución respecto del 1,3 % en julio de 2014. [4] Shift JIS es la segunda codificación de caracteres más declarada para sitios web japoneses, utilizada por el 4,4 % de los sitios en el dominio .jp, mientras que UTF-8 es utilizada por el 96 % de los sitios web japoneses. [5] [6]
Shift JIS es una extensión de la codificación de un solo byte JIS X 0201 :1997 , que utiliza puntos de código no asignados en JIS X 0201 para codificar el conjunto de caracteres de doble byte JIS X 0208 :1997 . Los bytes iniciales de los caracteres de doble byte se "desplazan" alrededor de los 64 caracteres katakana de ancho medio en el rango de un solo byte de 0xA1 a 0xDF .
Los caracteres de un solo byte 0x 00 a 0x7F coinciden con la codificación ASCII , excepto por un signo de yen (U+00A5) en 0x5C y una raya superior (U+203E) en 0x7E en lugar de la barra invertida y la tilde del conjunto de caracteres ASCII respectivamente (estas desviaciones de ASCII se alinean con JIS X 0201 ). Los caracteres de un solo byte de 0xA1 a 0xDF se asignan a los caracteres katakana de ancho medio que se encuentran en JIS X 0201 .
En el caso de caracteres de doble byte, el primer byte siempre se encuentra en el rango de 0x81 a 0x9F o en el rango de 0xE0 a 0xEF (estos rangos no están asignados en JIS X 0201 ). Si el primer byte es impar, el segundo byte debe estar en el rango de 0x40 a 0x9E (pero no puede ser 0x7F); si el primer byte es par, el segundo byte debe estar en el rango de 0x9F a 0xFC.
Shift JIS solo garantiza que el primer byte de caracteres de dos bytes será el bit alto establecido (0x80–0xFF); el valor del segundo byte puede ser alto o bajo. La aparición de valores de byte 0x40–0x7E como segundos bytes de palabras de código dificulta la detección confiable de Shift JIS, porque se utilizan los mismos códigos para caracteres ASCII. Dado que el mismo valor de byte puede ser el primer o el segundo byte, las búsquedas de cadenas son difíciles, ya que las búsquedas simples pueden coincidir con el segundo byte de un carácter y el primer byte del siguiente, que no es un carácter Shift JIS válido. Los algoritmos de búsqueda de cadenas deben estar hechos a medida para Shift JIS .
Shift JIS es totalmente compatible con la codificación de un solo byte JIS X 0201 , lo que significa que cualquier cadena JIS X 0201 válida también es una cadena Shift JIS válida.
Los caracteres de doble byte en JIS X 0208 deben transformarse para poder codificarse en Shift JIS. Para una secuencia de doble byte JIS X 0208 , [c] la transformación a los bytes Shift JIS correspondientes es:
El formato competidor de 8 bits EUC-JP , que no admite katakana de medio ancho de un solo byte, permite una conversión más limpia y directa hacia y desde puntos de código JIS X 0208 , ya que todos los bytes de conjunto de bits altos son partes de un carácter de doble byte y todos los códigos del rango ASCII representan caracteres de un solo byte.
El HTML escrito en Shift JIS aún se puede interpretar hasta cierto punto cuando se etiqueta incorrectamente como ASCII y cuando la etiqueta de conjunto de caracteres está en la parte superior del documento mismo, ya que el inicio y el final importantes de las etiquetas y campos HTML ( <
, >
, /
, "
, &
, ;
) se codifican como los mismos bytes que en ASCII, y esos bytes no aparecen en secuencias de dos bytes.
Shift JIS se puede utilizar en literales de cadena en lenguajes de programación como C , pero se deben tener en cuenta algunas cosas. En primer lugar, que el carácter de escape 0x5C, normalmente barra invertida , es el signo del yen de ancho medio (¥) en Shift JIS. Si el programador es consciente de esto, sería posible utilizar (donde ハローワールド es Hola, mundo y ¥n es una secuencia de escape), suponiendo que el sistema de E/S admita la salida Shift JIS . En segundo lugar, el byte 0x5C causará problemas cuando aparezca como segundo byte de un carácter de dos bytes, porque se interpretará como una secuencia de escape, lo que arruinará la interpretación, a menos que vaya seguido de otro 0x5C.printf("ハローワールド¥n");
Existen muchas versiones diferentes de Shift JIS. Hay dos áreas de expansión:
En primer lugar, JIS X 0208 no llena todo el espacio de 94×94 codificado para él en Shift JIS, por lo tanto, aquí hay lugar para más caracteres (en realidad, se trata de extensiones de JIS X 0208, más que de Shift JIS en sí).
En segundo lugar, Shift JIS tiene más espacio de codificación del que se necesita para JIS X 0201 y JIS X 0208 (véase el § Mapa de bytes de Shift JIS a continuación), y este espacio se puede utilizar y se utiliza para aún más caracteres (ya sea como caracteres de un solo byte o de doble byte).
La extensión más popular es la página de códigos 932 de Windows (un CCSID también utilizado para la extensión de IBM a Shift JIS ), que está registrada en la IANA como "Windows-31J", [1] por separado de Shift JIS. Esta fue popularizada por Microsoft, aunque Microsoft no reconoce el nombre Windows-31J y en su lugar llama a esa variación "shift_jis". [7] [8] La página de códigos 943 de IBM incluye los mismos códigos de doble byte que la página de códigos 932 de Microsoft, mientras que la página de códigos 932 de IBM incluye menos extensiones (excluyendo aquellas que Microsoft incorpora de NEC), y conserva el orden de caracteres de la edición de 1978 de JIS X 0208, en lugar de implementar los cambios de variantes de caracteres del estándar de 1983. [9]
Windows-31J asigna 0x5C a U+005C REVERSE SOLIDUS (la barra invertida ), y 0x7E a U+007E TILDE , siguiendo US-ASCII . [10] Sin embargo, la mayoría de las fuentes localizadas en Windows muestran U+005C como un signo de Yen para compatibilidad con JIS X 0201. [11] [12] Incluye varias extensiones, a saber, " Caracteres especiales NEC (Fila 13), selección NEC de extensiones IBM (Filas 89 a 92) y extensiones IBM (Filas 115 a 119)", [1] además de reservar algo de espacio de codificación para la definición del usuario final . [13]
La página de códigos 932 de Windows es la versión utilizada en el estándar de codificación W3C / WHATWG utilizado por HTML5 , que incluye las "extensiones anteriormente propietarias de IBM y NEC" de Windows-31J en su tabla para JIS X 0208, [14] y también trata la etiqueta "shift_jis" de manera intercambiable con "windows-31j" con la intención de que sea "compatible con el contenido implementado". [15]
La versión de Shift-JIS que se originó a partir del Mac OS clásico (conocida como x-mac-japanese
, Página de códigos 10001 [7] o MacJapanese) asignó la tilde a 0x7E (siguiendo US-ASCII , no JIS X 0201 que asigna la raya superior aquí), pero el signo del yen a 0x5C (como en JIS X 0201 y Shift JIS estándar ). También extendió JIS X 0201 asignando la barra invertida a 0x80 (correspondiente a 0x5C en US-ASCII), el espacio indivisible a 0xA0, el signo de copyright a 0xFD, el símbolo de marca registrada a 0xFE y los puntos suspensivos horizontales de ancho medio a 0xFF. También agregó caracteres extendidos de doble byte; incluidas 53 formas de presentación verticales en el rango Shift_JIS 0xEB41–0xED96, en 84 filas JIS por debajo de sus formas canónicas, y 260 caracteres especiales en el rango Shift_JIS 0x8540–0x886D. [16] Esta variante se introdujo en la versión 7 de KanjiTalk. [17]
Sin embargo, ciertas tipografías de Mac OS usaban otras variantes. Sai Mincho y Chu Gothic usan una variante " PostScript " de MacJapanese, que incluía formas de presentación verticales adicionales y un conjunto diferente de caracteres especiales extendidos, basados en los caracteres especiales NEC , algunos de los cuales solo estaban disponibles en las versiones para impresora de las fuentes. [16] Las versiones anteriores de Maru Gothic y Hon Mincho del Sistema 7.1 codificaban las formas de presentación verticales en 10 (no 84) filas JIS por debajo de sus formas canónicas, y no incluían las extensiones de caracteres especiales; esto se cambió posteriormente. [16] [18] La variante típica utilizada con KanjiTalk versión 6 colocaba las formas de presentación verticales 10 filas más abajo, y también usaba el diseño de extensión NEC para la fila 13. [19]
La nueva norma JIS X 0213 define una variante extendida de Shift_JIS denominada Shift_JISx0213 (en una versión anterior de la norma) o Shift_JIS-2004 . Se trata de un superconjunto de la norma Shift JIS. [20]
Para representar las filas asignadas en ambos planos de JIS X 0213, Shift_JIS-2004 utiliza el siguiente método de mapeo de puntos de código. [21]
En lo anterior, es una secuencia Shift_JIS-2004 de dos bytes, es el número de plano (面, men , superficie) (1 o 2), es el número de fila (区, ku , barrio) (1-94) y es el número de celda (点, ten , punto) (1-94). Los números ku y ten son equivalentes a y respectivamente, donde es una secuencia JIS de dos bytes que hace referencia a un plano determinado.
El mismo conjunto de caracteres puede representarse mediante EUC-JIS-2004 , la contraparte basada en EUC-JP.
Algunas de las adiciones entran en conflicto con las extensiones Shift JIS más populares, incluida la página de códigos 932 de Windows que se utiliza en los estándares web (véase más arriba). Por ejemplo, compare la fila 89 del plano 1 en JIS X 0213 (que comienza con 硃, 硎, 硏...) [22] con la fila 89 en la variante JIS X 0208 definida en los estándares web (que comienza con 纊, 褜, 鍈...). [23] Además, algunos de los caracteres se asignan a caracteres Unicode más allá del BMP.
El espacio con los bytes iniciales 0xF5 a 0xF9 (más allá de la región utilizada para JIS X 0208) es utilizado por los operadores de telefonía móvil japoneses para pictogramas destinados a su uso en correos electrónicos . [24] KDDI va más allá y define cientos más en el espacio con los bytes iniciales 0xF3 y 0xF4. [25]
Además de esto, se han realizado numerosas variaciones menores en Shift JIS, con caracteres individuales modificados aquí y allá. La mayoría de estas extensiones y variantes no tienen registro de la IANA , por lo que hay mucho margen para la confusión, si se utilizan las extensiones.
Una variante es la que se debe utilizar si se desea codificar Shift JIS en cadenas de código fuente de C y lenguajes de programación similares. Esta variante duplica el byte 0x5C si aparece como segundo byte de un carácter de dos bytes, pero no si aparece como un solo carácter "¥" (ASCII: "\"), porque 0x5C es el comienzo de una secuencia de escape . La mejor forma de manejar esto es un editor especial que codifique Shift JIS de esta manera.
La siguiente tabla muestra el significado detallado de cada byte en una secuencia codificada en el estándar Shift JIS (conforme a JIS X 0208:1997 ).
Algunos de los bytes que no se utilizan para códigos de un solo byte o bytes iniciales en JIS X 0208:1997 son utilizados por ciertas extensiones, lo que da como resultado el diseño detallado en el cuadro a continuación.