[英]ASCII encoding for string in GO
在 Ruby 中,您可以將字符串編碼為 ASCII,如下所示:
str.force_encoding('ASCII')
我們如何在 Go 中實現相同的目標?
strconv.QuoteToASCII
QuoteToASCII 返回表示 s 的雙引號 Go 字符串文字。 對於非 ASCII 字符和 IsPrint 定義的不可打印字符,返回的字符串使用 Go 轉義序列(\\t、\\n、\\xFF、\Ā)。
或者如果你想要一個 ascii 代碼數組,你可以這樣做
import "encoding/ascii85"
dst := make([]byte, 25, 25)
dst2 := make([]byte, 25, 25)
ascii85.Encode(dst, []byte("Hello, playground"))
fmt.Println(dst)
ascii85.Decode(dst2, dst, false)
fmt.Println(string(dst2))
省略無效符文的簡單版本可能如下所示:
func forceASCII(s string) string {
rs := make([]rune, 0, len(s))
for _, r := range s {
if r <= 127 {
rs = append(rs, r)
}
}
return string(rs)
}
// forceASCII("Hello, World!") // => "Hello, World!"
// forceASCII("Hello, 世界!") // => "Hello, !"
// forceASCII("Привет") // => ""
但是,如果目標 UTF-8 字符串包含[0,127]
ASCII 字符范圍之外的任何字符,您想要特殊行為怎么辦?
您可以編寫一個處理各種情況的函數,方法是提取一個函數參數,該參數采用無效 ASCII 符文並返回字符串替換或錯誤。
例如(去游樂場):
func forceASCII(s string, replacer func(rune) (string, error)) (string, error) {
rs := make([]rune, 0, len(s))
for _, r := range s {
if r <= 127 {
rs = append(rs, r)
} else {
replacement, err := replacer(r)
if err != nil {
return "", err
}
rs = append(rs, []rune(replacement)...)
}
}
return string(rs), nil
}
func main() {
replacers := []func(r rune) (string, error){
// omit invalid runes
func(_ rune) (string, error) { return "", nil },
// replace with question marks
func(_ rune) (string, error) { return "?", nil },
// abort with error */
func(r rune) (string, error) { return "", fmt.Errorf("invalid rune 0x%x", r) },
}
ss := []string{"Hello, World!", "Hello, 世界!"}
for _, s := range ss {
for _, r := range replacers {
ascii, err := forceASCII(s, r)
fmt.Printf("OK: %q → %q, err=%v\n", s, ascii, err)
}
}
// OK: "Hello, World!" → "Hello, World!", err=<nil>
// OK: "Hello, World!" → "Hello, World!", err=<nil>
// OK: "Hello, World!" → "Hello, World!", err=<nil>
// OK: "Hello, 世界!" → "Hello, !", err=<nil>
// OK: "Hello, 世界!" → "Hello, ??!", err=<nil>
// OK: "Hello, 世界!" → "", err=invalid rune 0x4e16
}
檢查這個功能
func UtftoAscii(s string) []byte {
t := make([]byte, utf8.RuneCountInString(s))
i := 0
for _, r := range s {
t[i] = byte(r)
i++
}
return t
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.