// ToPunycode converts unicode domain names to DNS-appropriate punycode names. // This function will return an empty string result for domain names with // invalid unicode strings. This function expects domain names in lowercase. func ToPunycode(s string) string { // Early check to see if encoding is needed. // This will prevent making heap allocations when not needed. if !needToPunycode(s) { return s } tokens := dns.SplitDomainName(s) switch { case s == "": return "" case tokens == nil: // s == . return "." case s[len(s)-1] == '.': tokens = append(tokens, "") } for i := range tokens { t := encode([]byte(tokens[i])) if t == nil { return "" } tokens[i] = string(t) } return strings.Join(tokens, ".") }
// FromPunycode returns unicode domain name from provided punycode string. func FromPunycode(s string) string { tokens := dns.SplitDomainName(s) switch { case s == "": return "" case tokens == nil: // s == . return "." case s[len(s)-1] == '.': tokens = append(tokens, "") } for i := range tokens { tokens[i] = string(decode([]byte(tokens[i]))) } return strings.Join(tokens, ".") }