123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- // +build !windows,!js
- package runewidth
- import (
- "os"
- "regexp"
- "strings"
- )
- var reLoc = regexp.MustCompile(`^[a-z][a-z][a-z]?(?:_[A-Z][A-Z])?\.(.+)`)
- func IsEastAsian() bool {
- locale := os.Getenv("LC_CTYPE")
- if locale == "" {
- locale = os.Getenv("LANG")
- }
- // ignore C locale
- if locale == "POSIX" || locale == "C" {
- return false
- }
- if len(locale) > 1 && locale[0] == 'C' && (locale[1] == '.' || locale[1] == '-') {
- return false
- }
- charset := strings.ToLower(locale)
- r := reLoc.FindStringSubmatch(locale)
- if len(r) == 2 {
- charset = strings.ToLower(r[1])
- }
- if strings.HasSuffix(charset, "@cjk_narrow") {
- return false
- }
- for pos, b := range []byte(charset) {
- if b == '@' {
- charset = charset[:pos]
- break
- }
- }
- mbc_max := 1
- switch charset {
- case "utf-8", "utf8":
- mbc_max = 6
- case "jis":
- mbc_max = 8
- case "eucjp":
- mbc_max = 3
- case "euckr", "euccn":
- mbc_max = 2
- case "sjis", "cp932", "cp51932", "cp936", "cp949", "cp950":
- mbc_max = 2
- case "big5":
- mbc_max = 2
- case "gbk", "gb2312":
- mbc_max = 2
- }
- if mbc_max > 1 && (charset[0] != 'u' ||
- strings.HasPrefix(locale, "ja") ||
- strings.HasPrefix(locale, "ko") ||
- strings.HasPrefix(locale, "zh")) {
- return true
- }
- return false
- }
|