3 回答

TA貢獻1895條經驗 獲得超7個贊
戈朗語中的 Unicode 字符(如中文字符)需要 3 個字節,而 ASCII 只需要 1 個字節。這是設計使然。
如果要檢查 unicode 字符的實際字符串大小,請使用 unicode/utf8 內置包。
fmt.Printf("String: %s\nLength: %d\nRune Length: %d\n", c, len(c), utf8.RuneCountInString(c))
// String: 這是一個測試
// Length: 18
// Rune Length: 6
更基本的計數方法是使用 for 循環。
count := 0
for range "這是一個測試" {
count++
}
fmt.Printf("Count=%d\n", count)
// Count=6
關于表格格式的中英文字符串的漂亮印刷,似乎沒有直接的方法。在這種情況下,制表符也不起作用。一個小的黑客解決這個問題是使用csv編寫器,如下所示:
data := [][]string{
{"這是一個測試", "|"},
{"aaaaaaaaaa", "|"},
{"つのだ☆HIRO", "|"},
{"aaaaaaaaaa", "|"},
}
w := csv.NewWriter(os.Stdout)
defer w.Flush()
w.Comma = '\t'
for _, row := range data {
w.Write(row)
}
這應該按預期打印數據。不幸的是,堆棧溢出打印的格式與我在終端中看到的格式不同。但游樂場拯救了我們。點擊這里
Note:這適用于符文大小彼此足夠接近的字符串。對于更長的字符串,您需要更多的解決方法。

TA貢獻1802條經驗 獲得超4個贊
我認為這是你想要的
func TestChinese(t *testing.T) {
tests := []string{
"這是一個測試",
"aaaaaaaaa",
"つのだ☆HIRO",
"aaaaaaaaaa",
"這是aaaaa一個測試",
"這是一個つの測試",
}
for _, tt := range tests {
fmt.Printf("%s\t%d\t%d\n", tt, len([]rune(tt)), len([]byte(tt)))
}
}
輸出:
這是一個測試 6 18
aaaaaaaaa 9 9
つのだ☆HIRO 8 16
aaaaaaaaaa 10 10
這是aaaaa一個測試 11 23
這是一個つの測試 8 24

TA貢獻1777條經驗 獲得超10個贊
您的問題(如mkopriva在評論中指出的那樣)是一個顯示問題,不適合通過任何類型的計數技巧來解決。
當我們用英語顯示可變音高或比例文本與等寬文本時,我們遇到了同樣的問題。也就是說,比較:
mmmm, tasty iiii, tasty?
跟:
嗯,好吃
,好吃嗎?
(假設您使用瀏覽器閱讀此答案!我們不必打印漢字,甚至不必留下簡單的ASCII來解決問題!
您需要的是用于中文文本的等寬顯示字體,或者可能是一些以表格形式排版的軟件,以及您如何獲得...完全是另一個問題。
- 3 回答
- 0 關注
- 124 瀏覽
添加回答
舉報