gitee.com/quant1x/gox@v1.7.6/text/encoding/shiftjis.go (about) 1 package encoding 2 3 // Converters for the Shift-JIS encoding. 4 5 import ( 6 "sync" 7 ) 8 9 func init() { 10 RegisterCharset(&Charset{ 11 Name: "Shift_JIS", 12 Aliases: []string{"MS_Kanji", "csShiftJIS", "SJIS"}, 13 NewDecoder: func() Decoder { 14 sjisOnce.Do(makeSjisTable) 15 return sjisTable.Decoder() 16 }, 17 NewEncoder: func() Encoder { 18 sjisOnce.Do(makeSjisTable) 19 return sjisTable.Encoder() 20 }, 21 }) 22 } 23 24 var sjisOnce sync.Once 25 26 var sjisTable MBCSTable 27 28 func makeSjisTable() { 29 var b [2]byte 30 31 for jis0208, unicode := range jis0208ToUnicode { 32 if unicode == 0 { 33 continue 34 } 35 36 j1 := byte(jis0208 >> 8) 37 j2 := byte(jis0208) 38 39 if j1 < 95 { 40 b[0] = (j1+1)/2 + 112 41 } else { 42 b[0] = (j1+1)/2 + 176 43 } 44 45 if j1&1 == 1 { 46 b[1] = j2 + 31 47 if j2 >= 96 { 48 b[1]++ 49 } 50 } else { 51 b[1] = j2 + 126 52 } 53 54 sjisTable.AddCharacter(rune(unicode), string(b[:])) 55 } 56 57 for jis0201, unicode := range jis0201ToUnicode { 58 if unicode == 0 { 59 continue 60 } 61 62 sjisTable.AddCharacter(rune(unicode), string(byte(jis0201))) 63 } 64 65 for i := '\x00'; i < 32; i++ { 66 sjisTable.AddCharacter(i, string(byte(i))) 67 } 68 69 sjisTable.AddCharacter(0x7f, "\x7f") 70 }