Введение
Японская кодировка символов
Shift JIS (Shift Japanese Industrial Standards, также SJIS, MIME-имя Shift JIS, известная как PCK в контексте Solaris) — Shift JIS является второй по распространенности кодировкой символов для японских веб-сайтов, используемой на 5,2% сайтов в домене jp, в то время как UTF-8 используется на 94,8% японских веб-сайтов.
Структура
Shift JIS является расширением однобайтовой кодировки JIS X 0201:1997, использующей неназначенные кодовые точки в JIS X 0201 для кодирования двухбайтового набора символов JIS X 0208:1997. Ведущие байты для двухбайтовых символов "сдвигаются" относительно 64 полуширинных символов катаканы в однобайтовом диапазоне от 0xA1 до 0xDF. Однобайтовые символы от 0x00 до 0x7F соответствуют кодировке ASCII, за исключением знака йены (U+00A5) по адресу 0x5C и символа надчеркивания (U+203E) по адресу 0x7E вместо обратной косой черты и тильды в наборе символов ASCII соответственно (эти отклонения от ASCII соответствуют JIS X 0201). Однобайтовые символы от 0xA1 до 0xDF отображаются на полуширинные символы катаканы, содержащиеся в JIS X 0201. Для двухбайтовых символов первый байт всегда находится в диапазоне от 0x81 до 0x9F или от 0xE0 до 0xEF (эти диапазоны не назначены в JIS X 0201). Если первый байт нечетный, второй байт должен находиться в диапазоне от 0x40 до 0x9E (но не может быть 0x7F); если первый байт четный, второй байт должен находиться в диапазоне от 0x9F до 0xFC. Shift JIS гарантирует только, что старший бит первого байта двухбайтового символа установлен (0x80–0xFF); значение второго байта может быть как старшим, так и младшим. Появление байтовых значений от 0x40 до 0x7E в качестве вторых байтов кодовых слов затрудняет надежное определение кодировки Shift JIS, поскольку те же коды используются для символов ASCII. Поскольку одно и то же байтовое значение может быть как первым, так и вторым байтом, поиск строк затруднен, поскольку простой поиск может соответствовать второму байту одного символа и первому байту следующего, что не является допустимым символом Shift JIS. Алгоритмы поиска строк должны быть разработаны специально для Shift JIS.
Совместимость
Shift JIS полностью обратно совместим с однобайтовой кодировкой JIS X 0201, то есть любая допустимая строка JIS X 0201 также является допустимой строкой Shift JIS. Двухбайтовые символы в JIS X 0208 необходимо преобразовывать для кодирования в Shift JIS. Преобразование двухбайтовой последовательности JIS X 0208 в соответствующие байты Shift JIS осуществляется следующим образом:
Конкурирующий 8-битный формат EUC JP, который не поддерживает полуширинную катакану в однобайтовом представлении, обеспечивает более чистое и прямое преобразование в кодовые точки JIS X 0208 и обратно, поскольку все байты с установленным старшим битом являются частью двухбайтового символа, а все коды из диапазона ASCII представляют собой однобайтовые символы.
Использование
HTML, написанный в кодировке Shift JIS, все еще может быть частично интерпретирован, если ошибочно помечен как ASCII, особенно если тег charset находится в начале документа. Это связано с тем, что важные символы начала и конца HTML-тегов и полей (<, >, /, ", &, ;) кодируются теми же байтами, что и в ASCII, и эти байты не входят в двухбайтовые последовательности. Shift JIS можно использовать в строковых литералах в языках программирования, таких как C, но необходимо учитывать некоторые особенности. Во-первых, символ 0x5C, обычно представляющий обратную косую черту, в Shift JIS является символом полуширокой иены (¥). Если программист об этом знает, можно использовать, например, printf("ハローワールド¥n"); (где ハローワールド означает "Hello, world", а ¥n – это escape-последовательность), при условии, что система ввода-вывода поддерживает вывод в кодировке Shift JIS. Во-вторых, байт 0x5C может вызвать проблемы, если он встречается в качестве второго байта двухбайтового символа, поскольку он будет интерпретирован как escape-последовательность, что приведет к неправильной интерпретации, если за ним не следует еще один байт 0x5C.
Многочисленные версии
Существует множество различных версий Shift JIS. Есть две области для расширения:
Во-первых, стандарт JIS X 0208 не использует всё 94×94 пространство, зарезервированное для него в Shift JIS, поэтому здесь можно добавить больше символов. Фактически, это расширения стандарта JIS X 0208, а не самого Shift JIS. Во-вторых, Shift JIS располагает большим объёмом кодировочного пространства, чем требуется для стандартов JIS X 0201 и JIS X 0208 (см. § карта байтов Shift JIS ниже), и это пространство используется для кодирования ещё большего количества символов (как однобайтовых, так и двухбайтовых).
Windows-932 / Windows-31J (по умолчанию)
Наиболее популярным расширением является кодовая страница Windows 932 (CCSID, также используемая для расширения Shift JIS от IBM), зарегистрированная в IANA как "Windows 31J", отдельно от Shift JIS. Это стало популярным благодаря Microsoft, хотя сама Microsoft не признает название Windows 31J и вместо этого называет эту вариацию "shift jis". Кодовая страница 943 IBM включает те же двухбайтовые коды, что и кодовая страница 932 Microsoft, в то время как кодовая страница 932 IBM включает меньше расширений (за исключением тех, которые Microsoft включает от NEC) и сохраняет порядок символов из издания 1978 года JIS X 0208, а не реализует перестановки вариантов символов из стандарта 1983 года. Windows 31J присваивает 0x5C коду U+005C REVERSE SOLIDUS (обратная косая черта), а 0x7E коду U+007E TILDE, следуя стандарту US ASCII. Однако большинство локализованных шрифтов в Windows отображают U+005C как знак йены для совместимости с JIS X 0201. Она включает несколько расширений, а именно: "специальные символы NEC (ряд 13), выбор расширений IBM от NEC (ряды 89–92) и расширения IBM (ряды 115–119)". Кодовая страница Windows 932 является версией, используемой в стандарте кодирования W3C/WHATWG, применяемом в HTML5, который включает в свою таблицу для JIS X 0208 "ранее проприетарные расширения от IBM и NEC" из Windows 31J, а также рассматривает обозначения "shift jis" и "windows 31j" как взаимозаменяемые, стремясь к "совместимости с существующим контентом".
Windows codepage 932 is the version used in the W3C/WHATWG encoding standard used by HTML5, which includes the "formerly proprietary extensions from IBM and NEC" from Windows 31J in its table for JIS X 0208, and also treats the label "shift jis" interchangeably with "windows 31j" with the intent of being "compatible with deployed content".
Макяпонский
Версия Shift JIS, берущая начало в классической Mac OS (известная как x mac japanese, Code page 10001). Этот вариант был представлен в KanjiTalk версии 7. Однако некоторые шрифты Mac OS использовали другие варианты. Сай Минчо и Чу Готик используют "PostScript" вариант MacJapanese, который включал дополнительные формы вертикального представления и другой набор расширенных специальных символов, основанных на специальных символах NEC, некоторые из которых были доступны только в печатных версиях шрифтов. Типичный вариант, используемый с KanjiTalk версии 6, размещал формы вертикального представления на 10 строк ниже, а также использовал раскладку расширения NEC для 13-й строки.
Shift_JISx0213 и Shift_JIS-2004
Новый стандарт JIS X 0213 определяет расширенный вариант кодировки Shift JIS, называемый Shift JISx0213 (в предыдущей версии стандарта) или Shift JIS 2004. Он является надмножеством стандартной Shift JIS. Для представления выделенных строк на обеих плоскостях JIS X 0213, Shift JIS 2004 использует следующий метод сопоставления кодовых точек. В описанном выше, – двухбайтовая последовательность Shift JIS 2004, – номер плоскости (面) (1 или 2), – номер строки (区) (от 1 до 94) и – номер ячейки (点) (от 1 до 94). Значения ku и ten эквивалентны и соответственно, где – двухбайтовая последовательность JIS, ссылающаяся на данную плоскость. Тот же набор символов может быть представлен в EUC JIS 2004, соответствующей кодировке на основе EUC JP. Некоторые из новых символов конфликтуют с популярными расширениями Shift JIS, включая кодовую страницу Windows 932, используемую в веб-стандартах (см. выше). Например, сравните плоскость 1, строку 89 в JIS X 0213 (начинается с 硃, 硎, 硏) со строкой 89 в варианте JIS X 0208, определенном в веб-стандартах (начинается с 纊, 褜, 鍈). Кроме того, некоторые символы соответствуют символам Unicode за пределами BMP.
Другие варианты
Пространство с лидирующими байтами от 0xF5 до 0xF9 (за пределами области, используемой для JIS X 0208) используется японскими операторами мобильной связи для пиктограмм, применяемых в электронной почте. KDDI идет еще дальше и определяет сотни других пиктограмм в пространстве с лидирующими байтами от 0xF3 до 0xF4. Помимо этого, в Shift JIS было внесено множество незначительных изменений, с локальными изменениями отдельных символов. Большинство этих расширений и вариантов не зарегистрированы в IANA, что создает значительный потенциал для путаницы при их использовании. Один из вариантов необходим, если требуется кодировать Shift JIS в строках исходного кода на C и подобных языках программирования. Этот вариант удваивает байт 0x5C, если он встречается в качестве второго байта двухбайтового символа, но не в качестве одиночного символа "¥" (ASCII: "\"), поскольку 0x5C является началом управляющей последовательности. Наиболее эффективный способ обработки этого – использование специализированного редактора, который кодирует Shift JIS именно таким образом.
Как определено в JIS X 0208:1997
В таблице ниже приведено подробное описание значения каждого байта в потоке данных, закодированном в стандартной кодировке Shift JIS (соответствующей JIS X 0208:1997).
С расширениями от продавца или JIS X 0213
Некоторые байты, не используемые для однобайтовых кодов или начальных байтов в JIS X 0208:1997, применяются в определенных расширениях, что приводит к структуре, представленной в таблице ниже.