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  }