# Shift JIS

O Shift JIS (do inglês shift japanese industrial standards, também SJIS, nome MIME Shift_JIS) é uma codificação de caracteres para o idioma japonês, originalmente desenvolvido por uma empresa japonesa chamada ASCII Corporation em conjunto com a Microsoft e padronizado como JIS X 0208 Apêndice 1. Em fevereiro de 2021, 0,1% de todas as páginas da web usavam o Shift JIS, uma queda de 1,3% em julho de 2014.
Os sites japoneses têm a menor adoção de unicode, depois dos sites sul-coreanos (onde o EUC-KR é muito mais popular). O UTF-8 é usado apenas para 91,3% dos sites (o restante é Shift JIS e EUC-JP).

## Descrição

O Shift JIS é baseado em conjuntos de caracteres definidos dentro dos padrões (JIS) JIS X 0201:1997 (para os caracteres de byte único) e JIS X 0208:1997 (para os caracteres de byte duplo). Os bytes iniciais para os caracteres de byte duplo são "deslocados" em torno dos 64 caracteres katakana de meia largura no intervalo de byte único 0xA1 para 0xDF. Os caracteres de byte único 0x00 à 0x7F correspondem à codificação ASCII, exceto por um sinal iene (U+00A5) em 0x5C e um sobrelinhado (U+203E) em 0x7E, respectivamente, no lugar da barra invertida e do til do conjunto de caracteres ASCII. Os caracteres de byte único de 0xA1 à 0xDF são mapeados para os caracteres katakana de meia largura encontrados no JIS X 0201.
HTML escrito em Shift JIS ainda pode ser interpretado até certo ponto quando incorretamente marcado como ASCII e quando a tag charset está no topo do próprio documento (desde que o início e fim de tags importantes, campos HTML, <,>, /, ", &, e ; sejam codificados pelos mesmos bytes únicos que em ASCII e esses bytes não apareçam em sequências de dois bytes. É possível usar o Shift JIS em strings literais de linguagens de programação como C, mas algumas coisas devem ser levadas em consideração. Em primeiro lugar, o caractere de escape 0x5C, normalmente barra invertida, é o sinal de iene (¥) de meia largura em Shift JIS. Se o programador estiver ciente disso, seria possível usar printf ("ハローワールド¥n"); (onde ハローワー ルド é o programa "Hello, World!" e ¥n é uma sequência de escape), assumindo que o sistema de E/S suporte a saída Shift JIS. Em segundo lugar, o byte 0x5C causará problemas ao aparecer como segundo byte de um caractere de dois bytes, pois será interpretado como uma sequência de escape e atrapalhará a interpretação ( a não ser que seja seguido por outro 0x5C).
O Shift JIS requer um meio 8 bits compatível para transmissão e é totalmente retrocompatível com a codificação de byte único JIS X 0201 de legado (o que significa que suporta katakana de meia largura e qualquer string JIS X 0201 válida também é uma string Shift JIS válida). Para caracteres de dois bytes, entretanto, o Shift JIS garante apenas que o primeiro byte será o bit alto definido (0x80 à 0xFF). O valor do segundo byte pode ser alto ou baixo. O aparecimento de valores de byte 0x40 à 0x7E, como segundos bytes de palavras de código, dificulta a detecção confiável de Shift JIS porque os mesmos códigos são usados para caracteres ASCII. Como o mesmo valor de byte pode ser o primeiro ou o segundo byte, as pesquisas de strings são difíceis (pois pesquisas simples podem corresponder ao segundo byte de um caractere e ao primeiro byte do próximo, que não é um caractere real). Algoritmos de pesquisa de strings para Shift JIS devem ser feitos sob medida.
Por outro lado, o formato concorrente de 8 bits EUC-JP, que não oferece suporte a katakana de meia largura de byte único, permite uma conversão muito mais limpa e direta de e para pontos de código JIS X 0208, pois todos os bytes de conjunto de bits altos são partes de um caractere de byte duplo e todos os códigos do intervalo ASCII representam caracteres de byte único.
O unicode também não tem algumas das desvantagens do Shift JIS. O unicode não tem versões ambíguas pois novos caracteres são atribuídos à lugares não utilizados por uma única organização. As áreas de uso privado são claramente designadas, nunca serão usadas para caracteres padrão e raramente são necessárias devido à abrangente natureza do unicode. Para o Shift JIS, as empresas trabalham em paralelo. O unicode codificado com UTF-8 é compatível com as versões anteriores de ASCII também para 0x5C e não tem o problema de pesquisa de strings.
Para uma sequência JIS de byte duplo $j_{1}j_{2}$, a transformação para os bytes Shift JIS $s_{1}s_{2}$ correspondentes é:
    $s_{1}={\begin{cases}\left\lfloor {\frac {j_{1}+1}{2}}\right\rfloor +112&{\mbox{se }}33\leq j_{1}\leq 94\\\left\lfloor {\frac {j_{1}+1}{2}}\right\rfloor +176&{\mbox{se }}95\leq j_{1}\leq 126\end{cases}}$
    $s_{2}={\begin{cases}j_{2}+31+\left\lfloor {\frac {j_{2}}{96}}\right\rfloor &{\mbox{se }}j_{1}{\mbox{ é ímpar }}\\j_{2}+126&{\mbox{se }}j_{1}{\mbox{ é par }}\end{cases}}$

## Múltiplas versões

Existem muitas versões diferentes do Shift JIS. Existem duas áreas para expansão:
Em primeiro lugar, o JIS X 0208 não preenche todo o espaço 94 × 94 codificado para ele no Shift JIS, portanto, há espaço para mais caracteres (eles são, na verdade, extensões do JIS X 0208 e não do próprio Shift JIS).
Em segundo lugar, o Shift JIS tem mais espaço de codificação do que o necessário para o JIS X 0201 e o JIS X 0208 (consulte o § mapa de bytes Shift JIS abaixo), e este espaço pode e é usado para ainda mais caracteres.

### Windows-932 / Windows-31J

A extensão mais popular é a página de código 932 do Windows (a CCSID também usada para extensão para Shift JIS da IBM), que está registrada na IANA como "Windows-31J", separadamente do Shift JIS. Isso foi popularizado pela Microsoft, embora a própria Microsoft não reconheça o nome Windows-31J e, em vez disso, chame essa variação de "shift_jis". A página de código 943 da IBM inclui os mesmos códigos de byte duplo que a página de código 932 da Microsoft, enquanto a página de código 932 da IBM inclui menos extensões (excluindo aquelas que a Microsoft incorpora da NEC) e mantém a ordem dos caracteres da edição de 1978 do JIS X 0208, em vez de implementar as trocas de variantes de caracteres do padrão de 1983.
O Windows-31J atribui o 0x5C à U+005C REVERSE SOLIDUS (a barra invertida) e 0x7E à U+007E til, seguindo o US-ASCII. No entanto, a maioria das fontes localizadas no Windows exibem o U+005C como um sinal de iene (para compatibilidade com o JIS X 0201). Ele inclui várias extensões, nomeadamente "caracteres especiais NEC (linha 13), seleção NEC de extensões IBM (linhas 89 à 92) e extensões IBM (linhas 115 à 119)", além de deixar algum espaço de codificação de lado para definição do usuário final.
A página de códigos 932 do Windows é a versão usada no padrão de codificação W3C/WHATWG usado por HTML5, que inclui as "extensões anteriormente proprietárias da IBM e NEC" do Windows-31J em sua tabela para JIS X 0208 e também trata o rótulo "shift_jis" de forma intercambiável com "windows-31j" com a intenção de ser "compatível com o conteúdo implantado".

### MacJapanese

A versão do Shift-JIS originada do Mac OS clássico (conhecida como x-mac-japanese, página de código 10001 ou MacJapanese) atribuída a til para 0x7E (seguindo o US-ASCII, não JIS X 0201 que atribui o sobrelinhado aqui), mas o sinal de iene para 0x5C (como em JIS X 0201 e Shift JIS padrão). Ela também estendeu o JIS X 0201 atribuindo a barra invertida à 0x80 (correspondendo à 0x5C em US-ASCII), o espaço sem quebra à 0xA0, o símbolo de direitos autorais à 0xFD, o símbolo de marca comercial para 0xFE e as reticências horizontais de meia largura para 0xFF. Ela também adicionou caracteres de byte duplo estendidos (incluindo 53 formas de apresentação vertical no intervalo Shift_JIS 0xEB41 à 0xED96 em 84 linhas JIS abaixo de seus formulários canônicos e 260 caracteres especiais no intervalo Shift_JIS 0x8540 à 0x886D. Esta variante foi introduzida no KanjiTalk versão 7.
No entanto, alguns tipos de letra do Mac OS usavam outras variantes. Sai Mincho e Chu Gothic usam uma variante "PostScript" do MacJapanese, que incluía formas de apresentação vertical adicionais e um conjunto diferente de caracteres especiais estendidos, com base nos caracteres especiais NEC, alguns dos quais estavam disponíveis apenas nas versões das fontes para impressora. Versões mais antigas de Maru Gothic e Hon Mincho do Sistema 7.1 codificavam formas de apresentação vertical em 10 (não 84) linhas JIS abaixo de suas formas canônicas e não incluíam as extensões de caracteres especiais, isso foi posteriormente alterado. A variante típica usada com o KanjiTalk versão 6 posicionou os formulários de apresentação vertical 10 linhas abaixo e também usou o layout de extensão NEC para a linha 13.

### Shift_JISx0213 e Shift_JIS-2004

O padrão JIS X 0213 mais recente define uma variante estendida de Shift_JIS conhecida como Shift_JISx0213 (em uma versão anterior do padrão) ou Shift_JIS-2004. É um superconjunto do Shift JIS padrão.
Para representar as linhas alocadas em ambos os planos de JIS X 0213, Shift_JIS-2004 usa o seguinte método de mapeamento de pontos de código.
    $s_{1}={\begin{cases}\left\lfloor {\frac {k+257}{2}}\right\rfloor &{\mbox{se }}m=1{\mbox{ e }}1\leq k\leq 62\\\left\lfloor {\frac {k+385}{2}}\right\rfloor &{\mbox{se }}m=1{\mbox{ e }}63\leq k\leq 94\\\left\lfloor {\frac {k+479}{2}}\right\rfloor -\left\lfloor {\frac {k}{8}}\right\rfloor \times 3&{\mbox{se }}m=2{\mbox{ e }}k=1,3,4,5,8,12,13,14,15\\\left\lfloor {\frac {k+411}{2}}\right\rfloor &{\mbox{se }}m=2{\mbox{ e }}78\leq k\leq 94\end{cases}}$
    $s_{2}={\begin{cases}t+63&{\mbox{se }}k{\mbox{ é ímpar e }}1\leq t\leq 63\\t+64&{\mbox{se }}k{\mbox{ é ímpar e }}64\leq t\leq 94\\t+158&{\mbox{se }}k{\mbox{ é par }}\end{cases}}$
Acima, $s_{1}s_{2}$ é uma sequência Shift_JIS-2004 de dois bytes, $m$ é o número do plano (面 - men)(1 ou 2), $k$ é o número da linha (区 - ku) (1-94) e $t$ é o número da célula (ou ponto) (点 - ten) (1-94). Os números ku e ten são, respectivamente, equivalentes à $j_{1}-32$ e $j_{2}-32$, onde $j_{1}j_{2}$ é uma sequência JIS de dois bytes referenciando um determinado plano.
O mesmo conjunto de caracteres pode ser representado por EUC-JIS-2004, a contraparte baseada em EUC-JP.
Algumas das adições entram em conflito com as extensões Shift JIS populares, incluindo a página de códigos 932 do Windows, que é usada em padrões da web (consulte acima). Por exemplo, compare o plano 1 linha 89 em JIS X 0213 (começando 硃, 硎, 硏…) com a linha 89 na variante JIS X 0208 definida em padrões da web (começando 纊, 褜, 鍈…). Além disso, alguns dos caracteres são mapeados para caracteres unicode além do BMP.

### Outras variantes

O espaço com bytes iniciais 0xF5 à 0xF9 (além da região usada para JIS X 0208) é usado por operadoras japonesas de telefonia móvel (celular) para pictogramas para uso em e-mail. A KDDI vai além e define mais centenas no espaço com os bytes principais 0xF3 e 0xF4.
Além disso, houve inúmeras variações menores feitas no Shift JIS, com caracteres individuais alterados aqui e ali. A maioria dessas extensões e variantes não têm registro IANA, então há muito espaço para confusão, se as extensões forem usadas.
Uma variante é a que deve ser usada se quisermos codificar Shift JIS, no código-fonte, em strings de C e linguagens de programação semelhantes. Esta variante duplica o byte 0x5C se ele aparecer como um segundo byte de um caractere de dois bytes, mas não se ele aparecer como um único caractere "¥" (ASCII: "\"), porque 0x5C é o início de uma sequência de escape. A melhor maneira de lidar com isso é um editor especial que codifica o Shift JIS dessa maneira.

## Mapa de bytes Shift JIS
### Conforme definido em JIS X 0208:1997

O gráfico abaixo fornece o significado detalhado de cada byte em um fluxo codificado no Shift JIS padrão (em conformidade com JIS X 0208:1997).
Primeiro byte :
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
| 0 | ␀ | ␁ | ␂ | ␃ | ␄ | ␅ | ␆ | ␇ | ␈ | ␉ | ␊ | ␋ | ␌ | ␍ | ␎ | ␏ |
| 1 | ␐ | ␑ | ␒ | ␓ | ␔ | ␕ | ␖ | ␗ | ␘ | ␙ | ␚ | ␛ | ␜ | ␝ | ␞ | ␟ |
| 2 | ␠ | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / |
| 3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
| 4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
| 5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | ¥ | ] | ^ | _ |
| 6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
| 7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ‾ | ␡ |
| 8 | | | | | | | | | | | | | | | | |
| 9 | | | | | | | | | | | | | | | | |
| A | | ｡ | ｢ | ｣ | ､ | ･ | ｦ | ｧ | ｨ | ｩ | ｪ | ｫ | ｬ | ｭ | ｮ | ｯ |
| B | ｰ | ｱ | ｲ | ｳ | ｴ | ｵ | ｶ | ｷ | ｸ | ｹ | ｺ | ｻ | ｼ | ｽ | ｾ | ｿ |
| C | ﾀ | ﾁ | ﾂ | ﾃ | ﾄ | ﾅ | ﾆ | ﾇ | ﾈ | ﾉ | ﾊ | ﾋ | ﾌ | ﾍ | ﾎ | ﾏ |
| D | ﾐ | ﾑ | ﾒ | ﾓ | ﾔ | ﾕ | ﾖ | ﾗ | ﾘ | ﾙ | ﾚ | ﾛ | ﾜ | ﾝ | ﾞ | ﾟ |
| E | | | | | | | | | | | | | | | | |
| F | | | | | | | | | | | | | | | | |
Segundo byte :
* 0
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* A
* B
* C
* D
* E
* F
* Caractere ASCII não imprimível
* Caractere ASCII inalterado
* Caractere ASCII modificado
* Katakana de meia largura de byte único
* Primeiro byte de um caractere de byte duplo JIS X 0208
* Não utilizado como primeiro byte de um caractere JIS X 0208
* Segundo byte de um caractere de byte duplo JIS X 0208 cuja primeira metade da sequência JIS era estranha
* Segundo byte de um caractere de byte duplo JIS X 0208 cuja primeira metade da sequência JIS foi uniforme
* Não utilizado como segundo byte de um caractere JIS X 0208

### Com extensões de fornecedor ou JIS X 0213

Alguns dos bytes que não são usados para códigos de byte único ou bytes iniciais em JIS X 0208:1997 são usados por certas extensões, resultando no layout detalhado no gráfico abaixo.
Primeiro byte :
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
| 0 | ␀ | ␁ | ␂ | ␃ | ␄ | ␅ | ␆ | ␇ | ␈ | ␉ | ␊ | ␋ | ␌ | ␍ | ␎ | ␏ |
| 1 | ␐ | ␑ | ␒ | ␓ | ␔ | ␕ | ␖ | ␗ | ␘ | ␙ | ␚ | ␛ | ␜ | ␝ | ␞ | ␟ |
| 2 | ␠ | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / |
| 3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
| 4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
| 5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | ¥ | ] | ^ | _ |
| 6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
| 7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ‾ | ␡ |
| 8 | | | | | | | | | | | | | | | | |
| 9 | | | | | | | | | | | | | | | | |
| A | | ｡ | ｢ | ｣ | ､ | ･ | ｦ | ｧ | ｨ | ｩ | ｪ | ｫ | ｬ | ｭ | ｮ | ｯ |
| B | ｰ | ｱ | ｲ | ｳ | ｴ | ｵ | ｶ | ｷ | ｸ | ｹ | ｺ | ｻ | ｼ | ｽ | ｾ | ｿ |
| C | ﾀ | ﾁ | ﾂ | ﾃ | ﾄ | ﾅ | ﾆ | ﾇ | ﾈ | ﾉ | ﾊ | ﾋ | ﾌ | ﾍ | ﾎ | ﾏ |
| D | ﾐ | ﾑ | ﾒ | ﾓ | ﾔ | ﾕ | ﾖ | ﾗ | ﾘ | ﾙ | ﾚ | ﾛ | ﾜ | ﾝ | ﾞ | ﾟ |
| E | | | | | | | | | | | | | | | | |
| F | | | | | | | | | | | | | | | | |
Segundo byte :
* 0
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* A
* B
* C
* D
* E
* F
* Caractere ASCII não imprimível
* Caractere ASCII inalterado
* Caractere ASCII modificado
* Katakana de de meia largura de byte único
* Primeiro byte de um caractere de byte duplo, usado por JIS X 0208 (e por extensões, como JIS X 0213 plano 1)
* Primeiro byte de um caractere de byte duplo, não alocado em JIS X 0208, mas usado por JIS X 0213 plano 1 ou por extensões de fornecedor
* Primeiro byte de um caractere de byte duplo além de JIS X 0208, usado para JIS X 0213 plano 2 ou para extensões não relacionadas
* Não usado como primeiro byte, usado por algumas extensões de byte único
* Segundo byte de um caractere de byte duplo cuja primeira metade da sequência JIS era estranha
* Segundo byte de um caractere de byte duplo cuja primeira metade da sequência JIS foi uniforme
* Não utilizado como segundo byte de um caractere de byte duplo