convert.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package public
  2. import (
  3. "encoding/gob"
  4. "os"
  5. "strconv"
  6. "strings"
  7. "sync"
  8. )
  9. type Convert struct {
  10. lock *sync.RWMutex
  11. lockun *sync.RWMutex
  12. mapping map[rune]rune
  13. unmapping map[rune]rune
  14. }
  15. //
  16. func NewConvert() *Convert {
  17. return &Convert{
  18. lock: new(sync.RWMutex),
  19. lockun: new(sync.RWMutex),
  20. mapping: make(map[rune]rune),
  21. unmapping: make(map[rune]rune),
  22. }
  23. }
  24. //支持动态切换mapping文件
  25. func (c *Convert) LoadMapping(mappingfilepath string) error {
  26. c.lock.Lock()
  27. defer c.lock.Unlock()
  28. c.lockun.Lock()
  29. defer c.lockun.Unlock()
  30. fi, err := os.Open(mappingfilepath)
  31. if err != nil {
  32. return err
  33. }
  34. mapping := make(map[string]string)
  35. err = gob.NewDecoder(fi).Decode(&mapping)
  36. if err != nil {
  37. return err
  38. }
  39. fi.Close()
  40. for k, v := range mapping {
  41. key_r, _ := strconv.ParseInt(k[3:], 16, 32)
  42. value_r, _ := strconv.ParseInt(v[3:], 16, 32)
  43. c.mapping[rune(value_r)] = rune(key_r)
  44. c.unmapping[rune(key_r)] = rune(value_r)
  45. }
  46. return nil
  47. }
  48. //转换
  49. func (c *Convert) DoConvert(src string) string {
  50. c.lock.RLock()
  51. defer c.lock.RUnlock()
  52. return strings.Map(func(r rune) rune {
  53. if v, ok := c.mapping[r]; ok {
  54. return v
  55. } else {
  56. return r
  57. }
  58. }, src)
  59. }
  60. func (c *Convert) UnConvert(src string) string {
  61. c.lockun.RLock()
  62. defer c.lockun.RUnlock()
  63. return strings.Map(func(r rune) rune {
  64. if v, ok := c.unmapping[r]; ok {
  65. return v
  66. } else {
  67. return r
  68. }
  69. }, src)
  70. }