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

3 回复

是的,你说得对。我应该仔细检查一下。看起来 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)
回到顶部