【golang】golang判断编码类型

type Charset string

const (
	UTF8    = Charset("UTF-8")
	GB18030 = Charset("GB18030")
	UNKNOWN = Charset("UNKNOWN")
)

func main() {
	webArr := []string{"https://www.bing.com/", "https://www.qq.com/", "https://www.php-china.com/", "https://www.so.com/?src=so.com", "https://www.sogou.com/", "https://www.baidu.com/"}
	// wg.Add(len(webArr))
	for i := 0; i < len(webArr); i++ {
		go func(url string) {
			pingHttp(url)
			// pingHttp("https://www.qq.com/")
			// pingHttp("https://www.baidu.com/")
			// pingHttp("https://www.bing.com/")
		}(webArr[i])
	}
	// wg.Wait()
	sig := make(chan os.Signal)
	signal.Notify(sig, os.Interrupt, os.Kill)
	<-sig
}

//ping网址
func pingHttp(url string) {
	// 获取状态码
	client := resty.New()
	//
	resp, err := client.R().EnableTrace().ForceContentType("application/json").Get(url)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("Status Code:", resp.StatusCode()) //返回的状态码
	fmt.Println("Size:", resp.Size())              //大小
	fmt.Println("Time:", resp.Time())              //加载速度
	fmt.Println("url:", url)                       //访问的路径

	coding := GetStrCoding([]byte(resp.String()))
	res := ConvertByte2String([]byte(resp.String()), coding)
	fmt.Println(res)
}

func ConvertByte2String(byte []byte, charset Charset) string {
	var str string
	switch charset {
	case GB18030:
		var decodeBytes, _ = simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
		str = string(decodeBytes)
	case UTF8:
		fallthrough
	default:
		str = string(byte)
	}

	return str
}
func preNUm(data byte) int {
	var mask byte = 0x80
	var num int = 0
	//8bit中首个0bit前有多少个1bits
	for i := 0; i < 8; i++ {
		if (data & mask) == mask {
			num++
			mask = mask >> 1
		} else {
			break
		}
	}
	return num
}

//判断内容编码格式
func GetStrCoding(data []byte) Charset {
	if isUtf8(data) == true {
		return UTF8
	} else if isGBK(data) == true {
		return GB18030
	} else {
		return UNKNOWN
	}
}

//判断是否为中文编码
func isGBK(data []byte) bool {
	length := len(data)
	var i int = 0
	for i < length {
		if data[i] <= 0x7f {
			//编码0~127,只有一个字节的编码,兼容ASCII码
			i++
			continue
		} else {
			//大于127的使用双字节编码,落在gbk编码范围内的字符
			if data[i] >= 0x81 &&
				data[i] <= 0xfe &&
				data[i+1] >= 0x40 &&
				data[i+1] <= 0xfe &&
				data[i+1] != 0xf7 {
				i += 2
				continue
			} else {
				return false
			}
		}
	}
	return true
}

//判断是否为utf-8编码
func isUtf8(data []byte) bool {
	i := 0
	for i < len(data) {
		if (data[i] & 0x80) == 0x00 {
			// 0XXX_XXXX
			i++
			continue
		} else if num := preNUm(data[i]); num > 2 {
			// 110X_XXXX 10XX_XXXX
			// 1110_XXXX 10XX_XXXX 10XX_XXXX
			// 1111_0XXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
			// 1111_10XX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
			// 1111_110X 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
			// preNUm() 返回首个字节的8个bits中首个0bit前面1bit的个数,该数量也是该字符所使用的字节数
			i++
			for j := 0; j < num-1; j++ {
				//判断后面的 num - 1 个字节是不是都是10开头
				if (data[i] & 0xc0) != 0x80 {
					return false
				}
				i++
			}
		} else {
			//其他情况说明不是utf-8
			return false
		}
	}
	return true
}

如果还是不懂可以留言,我看到了应该会回复
个人网站:https://www.php-china.com/blog/detail/96
如有错误,请多多指教。
如对你有帮助,给个赞吧。

上一篇:无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-ru


下一篇:【NOI2007】社交网络