Shift JIS ( Shift Japan Industrial Standards , также SJIS , MIME -имя Shift_JIS , известная как PCK в контексте Solaris ) [2] [3] — кодировка символов японского языка , первоначально разработанная японской компанией ASCII Corporation [b] совместно с Microsoft и стандартизирован как JIS X 0208, Приложение 1 .
Сдвиг JIS основан на наборах символов, определенных в стандартах JIS JIS X 0201 :1997 (для однобайтовых символов ) и JIS X 0208 :1997 (для двухбайтовых символов ).
По состоянию на февраль 2024 года [обновлять]0,3% опрошенных веб-страниц использовали Shift JIS (фактически декодированный как расширенная кодировка Windows-31J ), что меньше, чем 1,3% в июле 2014 года. [4] Shift JIS является второй по популярности кодировкой символов для японского языка. веб-сайты, используемые 5,3% сайтов в домене .jp. UTF-8 используется на 94,7% японских веб-сайтов. [5] [6]
Shift JIS — это расширение однобайтовой кодировки JIS X 0201 :1997 , которое использует неназначенные кодовые точки в JIS X 0201 для кодирования двухбайтового набора символов JIS X 0208 :1997 . Ведущие байты двухбайтовых символов «смещаются» вокруг 64 символов катаканы половинной ширины в однобайтовом диапазоне от 0xA1 до 0xDF .
Однобайтовые символы от 0x 00 до 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 [ c] преобразование в соответствующие байты Shift JIS выглядит следующим образом:
Конкурирующий 8-битный формат EUC-JP , который не поддерживает однобайтовую катакану половинной ширины, обеспечивает более чистое и прямое преобразование в кодовые точки JIS X 0208 и обратно , поскольку все байты со старшими битами являются частями двойного кода. -байтовый символ и все коды из диапазона ASCII представляют собой однобайтовые символы.
HTML, написанный в Shift JIS, по-прежнему можно интерпретировать в некоторой степени, если он неправильно помечен как ASCII и когда тег кодировки находится в верхней части самого документа, поскольку важные начало и конец тегов и полей HTML ( <
, >
, /
, "
, &
, ;
) кодируются теми же байтами, что и в ASCII, и эти байты не появляются в двухбайтовых последовательностях.
Shift JIS можно использовать в строковых литералах в таких языках программирования, как C , но необходимо принять во внимание несколько вещей. Во-первых, escape-символ 0x5C, обычно обратная косая черта , представляет собой знак иены половинной ширины (¥) в Shift JIS. Если программист знает об этом, его можно будет использовать (где ハローワールド — «Привет, мир», а ¥n — escape-последовательность), предполагая, что система ввода-вывода поддерживает вывод Shift JIS . Во-вторых, байт 0x5C вызовет проблемы, когда он появится как второй байт двухбайтового символа, поскольку он будет интерпретироваться как escape-последовательность, что испортит интерпретацию, если за ним не последует еще один 0x5C.printf("ハローワールド¥n");
Существует множество различных версий 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 ( CCSID также используется для расширения IBM для Shift JIS ), которая зарегистрирована в IANA как «Windows-31J» [1] отдельно от Shift JIS. Это было популяризировано Microsoft, хотя сама Microsoft не распознает имя Windows-31J и вместо этого называет этот вариант «shift_jis». [7] [8] Кодовая страница 943 IBM включает в себя те же двухбайтовые коды, что и кодовая страница 932 Microsoft, в то время как кодовая страница 932 IBM включает меньше расширений (за исключением тех, которые Microsoft включает в себя от NEC) и сохраняет порядок символов из издания 1978 года. JIS X 0208, вместо реализации замены вариантов символов из стандарта 1983 года. [9]
Windows-31J присваивает 0x5C U+005C REVERSE SOLIDUS ( обратная косая черта ) и 0x7E U+007E TILDE после US-ASCII . [10] Однако большинство локализованных шрифтов в Windows отображают U+005C как знак иены для совместимости с JIS X 0201 . [11] [12] Он включает в себя несколько расширений, а именно « специальные символы NEC (строка 13), выбор NEC расширений IBM (строки с 89 по 92) и расширения IBM (строки с 115 по 119)», [1] в дополнение к выделение некоторого пространства для кодирования для определения конечного пользователя . [13]
Кодовая страница Windows 932 — это версия, используемая в стандарте кодирования W3C / WHATWG , используемом HTML5 , который включает «ранее собственные расширения от IBM и NEC» из Windows-31J в своей таблице для JIS X 0208, [14] и также обрабатывает метку «shift_jis» взаимозаменяем с «windows-31j» с целью обеспечения «совместимости с развернутым контентом». [15]
Версия Shift-JIS, происходящая из классической Mac OS (известная как x-mac-japanese
, кодовая страница 10001 [7] или MacJapanese), присваивала тильде 0x7E (после US-ASCII , а не JIS X 0201 , который здесь назначает надстрочную черту ), а иены знак 0x5C (как в JIS X 0201 и стандартном Shift JIS ). Он также расширил JIS X 0201 , назначив обратную косую черту 0x80 (соответствует 0x5C в US-ASCII), неразрывный пробел 0xA0, знак авторского права 0xFD, символ товарного знака 0xFE и горизонтальное многоточие половинной ширины 0xFF. . Также были добавлены расширенные двухбайтовые символы; включая 53 формы вертикального представления в диапазоне Shift_JIS 0xEB41–0xED96, на 84 строки JIS ниже их канонических форм, и 260 специальных символов в диапазоне Shift_JIS 0x8540–0x886D. [16] Этот вариант был представлен в KanjiTalk версии 7. [17]
Однако в некоторых шрифтах Mac OS использовались другие варианты. Сай Минчо и Чу Готик используют вариант MacJapanese « PostScript », который включал дополнительные формы вертикального представления и другой набор расширенных специальных символов, основанных на специальных символах NEC , некоторые из которых были доступны только в версиях шрифтов для принтера. [16] Более старые версии Maru Gothic и Hon Mincho из Системы 7.1 кодировали формы вертикального представления на 10 (а не 84) строк JIS ниже их канонических форм и не включали расширения специальных символов; впоследствии это было изменено. [16] [18] В типичном варианте, используемом в KanjiTalk версии 6, формы вертикального представления размещались на 10 строк ниже, а также использовался макет расширения NEC для строки 13. [19]
Новый стандарт JIS X 0213 определяет расширенный вариант Shift_JIS, называемый Shift_JISx0213 (в предыдущей версии стандарта) или Shift_JIS-2004 . Это расширенный набор стандартного Shift JIS. [20]
Чтобы представить выделенные строки в обеих плоскостях JIS X 0213, Shift_JIS-2004 использует следующий метод сопоставления кодовых точек. [21]
В приведенном выше примере это двухбайтовая последовательность Shift_JIS-2004, номер плоскости (面, men , поверхность) (1 или 2), номер строки (区, ku , ward) (1-94) и номер номер ячейки (点, десять , точка) (1-94). Числа ku и десять эквивалентны и соответственно, где — двухбайтовая последовательность JIS, ссылающаяся на данную плоскость .
Тот же набор символов может быть представлен EUC-JIS-2004 , аналогом на основе EUC-JP.
Некоторые из дополнений конфликтуют с популярными расширениями Shift JIS, включая кодовую страницу Windows 932, которая используется в веб-стандартах (см. выше). Например, сравните строку 89 плоскости 1 в JIS X 0213 (начинается с 硃, 硎, 硏...) [22] со строкой 89 в варианте JIS X 0208, определенном в веб-стандартах (начинается с 纊, 褜, 鍈...). . [23] Кроме того, некоторые символы соответствуют символам Юникода за пределами BMP.
Пространство с ведущими байтами от 0xF5 до 0xF9 (за пределами региона, используемого для JIS X 0208) используется японскими операторами мобильной связи для пиктограмм для использования в электронной почте . [24] KDDI идет дальше и определяет еще сотни в пространстве с помощью ведущих байтов 0xF3 и 0xF4. [25]
Помимо этого, в Shift JIS было внесено множество незначительных изменений, с изменением отдельных символов здесь и там. Большинство этих расширений и вариантов не имеют регистрации IANA , поэтому при использовании расширений возникает большая вероятность путаницы.
Вариант — это тот, который необходимо использовать, если вы хотите закодировать Shift JIS в строках исходного кода C и подобных языков программирования. Этот вариант удваивает байт 0x5C, если он отображается как второй байт двухбайтового символа, но не в том случае, если он отображается как одиночный символ «¥» (ASCII: «\"), поскольку 0x5C является началом escape- последовательности . Лучший способ справиться с этим — специальный редактор, который кодирует Shift JIS таким образом.
В приведенной ниже таблице дано подробное значение каждого байта в потоке, закодированном в стандартном Shift JIS (соответствующем JIS X 0208:1997 ).
Некоторые байты, которые не используются для однобайтовых кодов или начальных байтов в JIS X 0208:1997 , используются определенными расширениями, в результате чего структура подробно описана в таблице ниже.