The two bytes FB FC are 髙 to a browser and in Microsoft's CP932 table, also called Windows-31J, and 騠, a different kanji, to a JIS X 0213 decoder. On 2 October 2026 we checked all 7,724 two-byte codes browsers define for Shift_JIS. Microsoft's published CP932 table matched on every one; Unicode's archived JIS X 0208 mapping differed at seven. A strict Shift_JIS decoder refused 845. A JIS X 0213 decoder read all 373 characters of IBM's extension set, 360 of them kanji, as other kanji, and no converter reports an error. Counting each code once, 853 of the 7,724 (11%) were read as another character or refused by at least one of four converters that do not follow Microsoft's table. Shift_JIS names a family of tables; browsers use CP932.
Browsers and Microsoft's CP932 table agree code for code
Browsers follow the WHATWG Encoding Standard, which treats "shift_jis", "ms932" and "windows-31j" as labels for one encoding, whose table is JIS X 0208 "including formerly proprietary extensions from IBM and NEC". Microsoft's CP932.TXT, dated April 1998, holds the same 7,724 mappings. We compared tables and did not run Windows. A browser decodes 1,880 user-defined codes, F0 40 to F9 FC, into Unicode's Private Use Area. The IANA registry keeps Shift_JIS and Windows-31J as separate entries.
| Converter | Codes read as another character | Codes refused |
|---|---|---|
Python cp932, macOS iconv CP932 | 0 | 0 |
Python shift_jis | 6 | 845 |
macOS iconv SHIFT_JIS | 7 | 845 |
Python shift_jis_2004, macOS iconv SHIFT_JISX0213 | 769 | 10 |
The four converters behind the 853 fill the last three rows. We ran Python 3.9.6 and the iconv built into macOS 26.6, no other build, against the WHATWG index of 18 September 2024.
Unicode and Microsoft disagree on seven JIS cells, the wave dash among them
Unicode's mapping of JIS X 0208 is filed as obsolete and calls its data "possible mappings only". It differs from Microsoft's table at seven symbol cells.
| Bytes | Unicode's JIS0208.TXT | Browsers and CP932 |
|---|---|---|
| 81 5F | U+005C \ | U+FF3C \ |
| 81 60 | U+301C 〜 | U+FF5E ~ |
| 81 61 | U+2016 ‖ | U+2225 ∥ |
| 81 7C | U+2212 − | U+FF0D - |
| 81 91 | U+00A2 ¢ | U+FFE0 ¢ |
| 81 92 | U+00A3 £ | U+FFE1 £ |
| 81 CA | U+00AC ¬ | U+FFE2 ¬ |
Bytes 81 60, JIS cell 1-33, are the wave dash problem. Unicode encoded U+301C WAVE DASH to match it, and its errata for version 8.0.0 (October 2014) say the representative glyph was drawn inverted relative to the JIS source. Microsoft puts the full-width tilde there, so text crossing between tables returns as the other character or is refused. Microsoft's best-fit table has no entry for U+301C, so by that table Windows would write "?"; we did not test it.
The byte 5C is another point of disagreement. Browsers and Windows read it as a backslash, so a ¥ written as 5C returns as \, while Python's shift_jis_2004 and macOS iconv's SHIFT_JIS and SHIFT_JISX0213 read 5C as ¥.
Strict JIS decoders and the vendor rows split over 845 codes
A strict decoder reads the 6,879 codes of JIS X 0208 and refuses three vendor blocks: 83 codes in NEC's row 13 (①, Ⅰ, ㈱), 374 in NEC's selection of IBM characters (lead bytes ED and EE) and 388 in IBM's own extension (FA to FC). Those 845 codes carry only 447 characters missing from JIS X 0208, 74 from row 13 and 373 from IBM's set, because the browser's table lists 396 characters more than once; the NEC and IBM blocks repeat the same 373.
Browsers and Microsoft's table write 髙 (U+9AD9) as FB FC; Python's cp932 writes EE E0, and CP932 reads both back as 髙. Traditional Chinese has its own legacy encoding, covered in our Big5 guide.
JIS X 0213 and Windows share bytes for different kanji
JIS X 0213 puts its own characters where NEC and IBM put their kanji. Its decoders read the browser's bytes for all 373 IBM-set characters as something else; Python and macOS iconv agreed on each.
| Character | Bytes a browser writes | Read by JIS X 0213 as |
|---|---|---|
| 髙 U+9AD9 | Shift_JIS FB FC | 騠 U+9A20 |
| 﨑 U+FA11 | Shift_JIS FA B1 | 郫 U+90EB |
| 髙 U+9AD9 | EUC-JP FC E2 | 郄 U+90C4 |
NEC's copies fare no better: the same decoders misread all 374 codes at ED and EE. Row 13 mostly survives, 73 of 74 characters, with ∑ refused. 48 of the 373 results need a font covering CJK Extension B. We measured decoders and never how often any system converts.
Japan's Digital Agency names the 2012 edition. Its character requirements for standardised local-government systems (version 2.0, June 2023) set exchange between those systems as 「UTF-8 とする」 and make JIS X 0213:2012 the rule, in principle, for outside links with no agreed format. Its FAQ of 30 May 2025 says the change rolls out from fiscal 2025 across 20 business systems, with family registers allowed their old sets as a transitional measure, and warns that mismatched characters can end in 「文字化けや、黒塗り」, garbled or blacked-out text. It governs those systems only.
Private-use characters and our repair panel lined up only after a fix
Our Japanese encoding lookup uses the browser's tables. We tested its mojibake repair on 109 sentences from our Japanese about page, garbled nine ways. Until 2 October 2026, EUC-JP shown as Shift_JIS lost characters needlessly: EUC-JP bytes such as F1 land in Shift_JIS's user-defined range, which decodes one-to-one into private-use code points, yet the repair counted those as gone. Of the 24 garbles with no �, its top suggestion was exact for 4. It now reads those bytes back and is exact on 23; across all 109, wrong characters fell from 309 to 42. Its wave dash and 5C statements, once unqualified, now name the browser's and Microsoft's tables.
Mojibake pairs differ in how much a repair can recover
UTF-8, Shift_JIS and EUC-JP shown as Windows-1252 came back exactly in all 109 cases, since every byte survives as some character. Some of those are invisible: the garbles held 1,300 C1 control characters, and with them stripped exact recovery fell to 0. UTF-8 shown as Shift_JIS put � into 103 of 109; the repair recovered 82.8% of characters and guessed none wrongly. Shift_JIS shown as UTF-8 kept 19.0%, and Shift_JIS shown as EUC-JP left 100 of 109 with no candidate. A � means the bytes are gone, and the only full repair is reopening the original file with the right encoding.
macOS iconv and a file from Windows fall out silently under -c
We wrote ①髙橋~様 with the browser's Shift_JIS encoder: ten bytes, 87 40 FB FC 8B B4 81 60 97 6C. macOS iconv, run as iconv -f SHIFT_JIS -t UTF-8, stopped with "Illegal byte sequence" and exit status 1. With -c, which discards what it cannot convert, it printed 橋〜様 and exited 0 with no message: ① and 髙 deleted, the full-width tilde turned into a wave dash. Under -f CP932 the file came back intact. Encoding is louder: UTF-8 to SHIFT_JIS with -c also drops ① and 髙, but warns and exits 1. A script checking only the exit status would pass the decode with two characters missing.