ZetCode

Golang strconv.Quote

最后修改于 2025 年 4 月 20 日

本教程解释了如何在 Go 中使用 strconv.Quote 函数。我们将通过实际示例介绍字符串转义基础知识。

strconv.Quote 函数将字符串转换为 Go 字符串字面量。它会添加双引号并使用 Go 的转义序列转义特殊字符。

Quote 在生成 Go 源代码或安全显示字符串时非常有用。它处理所有特殊字符,包括换行符、制表符和 Unicode。

基本的 strconv.Quote 示例

strconv.Quote 最简单的用法是添加引号并转义字符串。在这里,我们演示了基本的字符串引用功能。

basic_quote.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    s := "Hello, World!"
    quoted := strconv.Quote(s)
    
    fmt.Println("Original:", s)
    fmt.Println("Quoted:", quoted)
}

我们将一个简单的字符串转换为 Go 字符串字面量。输出显示了原始版本和引用版本。引用的字符串带有围绕的双引号。

转义特殊字符

strconv.Quote 会自动转义特殊字符。此示例显示了它如何处理各种控制字符。

escaping.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    s := "Line1\nLine2\tTab\"Quote"
    quoted := strconv.Quote(s)
    
    fmt.Println("Original:", s)
    fmt.Println("Quoted:", quoted)
}

该字符串包含换行符、制表符和引号字符。引用的版本显示这些字符已被反斜杠序列转义。这使得字符串对 Go 代码是安全的。

处理 Unicode 字符

strconv.Quote 可以正确处理 Unicode 字符。非 ASCII 字符会使用 Unicode 转义序列进行转义。

unicode.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    s := "Gö 语言 😊"
    quoted := strconv.Quote(s)
    
    fmt.Println("Original:", s)
    fmt.Println("Quoted:", quoted)
}

该字符串包含非 ASCII 字符,包括表情符号。引用的版本使用 \u 和 \U 序列转义它们。这确保了跨系统的可移植性。

QuoteToASCII 函数

strconv.QuoteToASCII 将所有非 ASCII 字符转换为转义序列。此示例将其与常规 Quote 进行比较。

quote_to_ascii.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    s := "Nürnberg 日本"
    
    fmt.Println("Quote:", strconv.Quote(s))
    fmt.Println("QuoteToASCII:", strconv.QuoteToASCII(s))
}

QuoteToASCII 确保输出仅包含 ASCII 字符。常规 Quote 可能会将某些 Unicode 字符保持未转义状态,如果它们是可打印的。

QuoteRune 函数

对于单个 rune,strconv.QuoteRune 提供类似的功能。此示例展示了引用单个 Unicode 字符。

quote_rune.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    r := '世'
    quoted := strconv.QuoteRune(r)
    
    fmt.Printf("Rune: %U\n", r)
    fmt.Println("Quoted:", quoted)
}

QuoteRune 会添加单引号并在需要时转义 rune。在处理单个 Unicode 代码点而不是字符串时,它很有用。

取消引用字符串

strconv.Unquote 函数可以撤销引用过程。此示例演示了如何将引用的字符串转换回其原始形式。

unquote.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    quoted := `"Hello,\nWorld!"`
    
    s, err := strconv.Unquote(quoted)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    
    fmt.Println("Quoted:", quoted)
    fmt.Println("Unquoted:", s)
}

我们将一个引用的字符串字面量转换回普通字符串。该函数处理所有转义序列并返回原始字符串内容。

实际示例:JSON 编码

这个实际示例展示了在手动构建 JSON 字符串时如何使用 strconv.Quote。正确的引用对于有效的 JSON 至关重要。

json_encoding.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    name := "Alice"
    message := "Hello,\nWorld!"
    
    json := fmt.Sprintf(`{"name":%s,"message":%s}`,
        strconv.Quote(name),
        strconv.Quote(message))
    
    fmt.Println("JSON:", json)
}

我们通过引用值来手动构建 JSON 字符串。这确保了特殊字符在输出中被正确转义。结果是有效的 JSON。

来源

Go strconv 包文档

本教程通过各种场景下的字符串转义的实际示例,介绍了 Go 中的 strconv.Quote 函数。

作者

我叫 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出所有 Go 教程