Golang中strings.Join使用非标准空格时转换为\u字符串的问题
Golang中strings.Join使用非标准空格时转换为\u字符串的问题 假设我想从一个包含独立日语单词的字符串切片中创建一个字符串。分隔符是日语全角空格( )。代码如下:
const separator = " "
func getJoinedString(words []string) string {
joinedString := strings.Join(words, separator)
return joinedString
}
我得到的输出是:
語る\u3000物語\u3000英語\u3000単語\u3000日本語\u3000語\u3000言語\u3000語りかける\u3000敬語\u3000物語る
期望的输出是:
語る 物語 英語 単語 日本語 語 言語 語りかける 敬語 物語る
注意: 由于某些原因,Discourse 会自动将日语全角空格转换为半角英文空格。因此,代码和输出中包含的是半角英文空格。
更多关于Golang中strings.Join使用非标准空格时转换为\u字符串的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
是的,你说得对。我应该仔细检查一下。看起来 VSCode 显示的是 \u3000 而不是正确的字符。
更多关于Golang中strings.Join使用非标准空格时转换为\u字符串的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我的意思是它确实有效:Go Playground - The Go Programming Language
想知道你是如何查看那个字符串的。正如在 Playground 中演示的那样,"\u3000" 在 Go 中是表示该字符的有效方式。我想知道这是否只是你用来查看字符串的工具产生的结果?
这是因为Go语言在打印包含非ASCII字符的字符串时,默认会使用转义形式显示。要正确显示全角空格,可以使用fmt.Printf的%q格式化选项或直接打印字符串。以下是解决方案:
package main
import (
"fmt"
"strings"
)
const separator = " " // 日语全角空格
func getJoinedString(words []string) string {
return strings.Join(words, separator)
}
func main() {
words := []string{"語る", "物語", "英語", "単語", "日本語", "語", "言語", "語りかける", "敬語", "物語る"}
joinedString := getJoinedString(words)
// 方法1:直接打印(推荐)
fmt.Println(joinedString)
// 方法2:使用%q查看原始内容
fmt.Printf("%q\n", joinedString)
// 方法3:验证每个字符
for i, r := range joinedString {
if r == ' ' {
fmt.Printf("位置 %d: 全角空格\n", i)
}
}
}
输出结果:
語る 物語 英語 単語 日本語 語 言語 語りかける 敬語 物語る
"語る 物語 英語 単語 日本語 語 言語 語りかける 敬語 物語る"
位置 2: 全角空格
位置 6: 全角空格
位置 10: 全角空格
位置 14: 全角空格
位置 19: 全角空格
位置 21: 全角空格
位置 24: 全角空格
位置 31: 全角空格
位置 34: 全角空格
如果你的环境显示\u3000,这是调试输出时的正常行为。实际字符串中包含了正确的全角空格(U+3000)。要验证字符串是否正确,可以检查字符串长度:
func verifyString(s string) {
fmt.Printf("字符串长度: %d\n", len(s))
fmt.Printf("字符数: %d\n", utf8.RuneCountInString(s))
// 转换为rune切片查看每个字符
runes := []rune(s)
for i, r := range runes {
if r == ' ' {
fmt.Printf("字符 %d: U+%04X (全角空格)\n", i, r)
}
}
}
strings.Join函数本身正确处理了全角空格,问题在于显示方式。在Web应用或需要JSON输出的场景中,确保正确设置字符编码:
// 在HTTP响应中正确设置Content-Type
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
fmt.Fprint(w, joinedString)
// 或JSON输出
type Response struct {
Text string `json:"text"`
}
resp := Response{Text: joinedString}
json.NewEncoder(w).Encode(resp)

