charset_reader.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package mail
  2. import (
  3. "fmt"
  4. "golang.org/x/text/encoding/charmap"
  5. "golang.org/x/text/encoding/simplifiedchinese"
  6. "golang.org/x/text/transform"
  7. "io"
  8. "strings"
  9. )
  10. var charsetMap = map[string]transform.Transformer{
  11. "gb2312": simplifiedchinese.GBK.NewDecoder(),
  12. "gbk": simplifiedchinese.GBK.NewDecoder(),
  13. "ibm037": charmap.CodePage037.NewDecoder(),
  14. "ibm437": charmap.CodePage437.NewDecoder(),
  15. "ibm850": charmap.CodePage850.NewDecoder(),
  16. "ibm852": charmap.CodePage852.NewDecoder(),
  17. "ibm855": charmap.CodePage855.NewDecoder(),
  18. "ibm858": charmap.CodePage858.NewDecoder(),
  19. "ibm860": charmap.CodePage860.NewDecoder(),
  20. "ibm862": charmap.CodePage862.NewDecoder(),
  21. "ibm863": charmap.CodePage863.NewDecoder(),
  22. "ibm865": charmap.CodePage865.NewDecoder(),
  23. "ibm866": charmap.CodePage866.NewDecoder(),
  24. "ibm1047": charmap.CodePage1047.NewDecoder(),
  25. "ibm1140": charmap.CodePage1140.NewDecoder(),
  26. "iso-8859-1": charmap.ISO8859_1.NewDecoder(),
  27. "iso-8859-2": charmap.ISO8859_2.NewDecoder(),
  28. "iso-8859-3": charmap.ISO8859_3.NewDecoder(),
  29. "iso-8859-4": charmap.ISO8859_4.NewDecoder(),
  30. "iso-8859-5": charmap.ISO8859_5.NewDecoder(),
  31. "iso-8859-6": charmap.ISO8859_6.NewDecoder(),
  32. "iso-8859-7": charmap.ISO8859_7.NewDecoder(),
  33. "iso-8859-8": charmap.ISO8859_8.NewDecoder(),
  34. "iso-8859-9": charmap.ISO8859_9.NewDecoder(),
  35. "iso-8859-10": charmap.ISO8859_10.NewDecoder(),
  36. "iso-8859-13": charmap.ISO8859_13.NewDecoder(),
  37. "iso-8859-14": charmap.ISO8859_14.NewDecoder(),
  38. "iso-8859-15": charmap.ISO8859_15.NewDecoder(),
  39. "iso-8859-16": charmap.ISO8859_16.NewDecoder(),
  40. "koi8-r": charmap.KOI8R.NewDecoder(),
  41. "koi8-u": charmap.KOI8U.NewDecoder(),
  42. "macintosh": charmap.Macintosh.NewDecoder(),
  43. "x-mac-cyrillic": charmap.MacintoshCyrillic.NewDecoder(),
  44. "windows-874": charmap.Windows874.NewDecoder(),
  45. "windows-1250": charmap.Windows1250.NewDecoder(),
  46. "windows-1251": charmap.Windows1251.NewDecoder(),
  47. "windows-1252": charmap.Windows1252.NewDecoder(),
  48. "windows-1253": charmap.Windows1253.NewDecoder(),
  49. "windows-1254": charmap.Windows1254.NewDecoder(),
  50. "windows-1255": charmap.Windows1255.NewDecoder(),
  51. "windows-1257": charmap.Windows1257.NewDecoder(),
  52. "windows-1258": charmap.Windows1258.NewDecoder(),
  53. "x-user-defined": charmap.XUserDefined.NewDecoder(),
  54. }
  55. // 定义一个自定义的 CharsetReader 函数,它能够处理 gb2312 和 gbk 字符集
  56. func myCharsetReader(charset string, input io.Reader) (io.Reader, error) {
  57. charset = strings.ToLower(charset)
  58. newDecoder, ok := charsetMap[charset]
  59. if ok {
  60. reader := transform.NewReader(input, newDecoder)
  61. return reader, nil
  62. }
  63. if charset == `utf-8` {
  64. return input, nil
  65. }
  66. switch strings.ToLower(charset) {
  67. case "gb2312", "gbk":
  68. reader := transform.NewReader(input, simplifiedchinese.GBK.NewDecoder())
  69. return reader, nil
  70. case "utf-8":
  71. return input, nil
  72. case "iso-8859-1":
  73. reader := transform.NewReader(input, charmap.ISO8859_1.NewDecoder())
  74. return reader, nil
  75. case "windows-1252":
  76. reader := transform.NewReader(input, charmap.Windows1252.NewDecoder())
  77. return reader, nil
  78. default:
  79. }
  80. return input, fmt.Errorf("unsupported charset: %s", charset)
  81. }