ZetCode

Golang strconv.QuoteRuneToASCII

最后修改于 2025 年 4 月 20 日

本教程将解释如何在 Go 中使用 strconv.QuoteRuneToASCII 函数。我们将通过实际示例涵盖 Rune 到字符串转换的基础知识。

strconv.QuoteRuneToASCII 函数将一个 Rune 转换为一个带 ASCII 引号的字符串。它对于在仅限 ASCII 的上下文中安全地表示 Rune 非常有用。

该函数返回一个表示该 Rune 的单引号字符串字面量。非 ASCII 和特殊字符将使用 Go 的转义序列进行转义。

基本的 QuoteRuneToASCII 示例

strconv.QuoteRuneToASCII 最简单的用法是将一个 Rune 转换为带引号的字符串。这里我们演示基本的 ASCII 和非 ASCII Rune 转换。

basic_quote.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    r := 'A'
    quoted := strconv.QuoteRuneToASCII(r)
    fmt.Printf("Rune '%c' quoted: %s\n", r, quoted)
    
    r2 := '世'
    quoted2 := strconv.QuoteRuneToASCII(r2)
    fmt.Printf("Rune '%c' quoted: %s\n", r2, quoted2)
}

我们将 ASCII 和非 ASCII Rune 都转换为带引号的字符串。非 ASCII Rune 使用 Unicode 转义序列进行转义。输出显示了带引号的形式。

处理特殊字符

strconv.QuoteRuneToASCII 会正确转义特殊字符。此示例显示了如何处理控制字符。

special_chars.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    specialChars := []rune{'\n', '\t', '\'', '\\', '\x00'}
    
    for _, r := range specialChars {
        quoted := strconv.QuoteRuneToASCII(r)
        fmt.Printf("Rune %U quoted: %s\n", r, quoted)
    }
}

我们测试了各种特殊字符,包括换行符、制表符和空字符。每个字符在输出中都得到了正确的转义。该函数确保了安全的表示。

与 QuoteRune 比较

此示例将 QuoteRuneToASCIIQuoteRune 进行比较。区别在于如何处理非 ASCII 字符。

compare_quote.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    r := '語'
    
    quotedASCII := strconv.QuoteRuneToASCII(r)
    quotedRegular := strconv.QuoteRune(r)
    
    fmt.Println("QuoteRuneToASCII:", quotedASCII)
    fmt.Println("QuoteRune:", quotedRegular)
}

QuoteRuneToASCII 会转义非 ASCII 字符,而 QuoteRune 则按原样保留它们。输出显示了表示上的差异。

处理 Unicode 值

此示例演示了 QuoteRuneToASCII 如何处理基本多文种平面之外的 Unicode 值。

unicode_values.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    highUnicode := []rune{
        '\U0001F600', // 😀
        '\U0001F680', // 🚀
        '\U0001F4A9', // 💩
    }
    
    for _, r := range highUnicode {
        quoted := strconv.QuoteRuneToASCII(r)
        fmt.Printf("Rune %U quoted: %s\n", r, quoted)
    }
}

表情符号和其他高 Unicode 字符会被正确转义。该函数使用 \U 后跟 8 位十六进制数字来表示它们。

生成 JSON 兼容字符串

QuoteRuneToASCII 可以帮助生成 JSON 兼容的字符串表示。此示例展示了它在 JSON 编码上下文中的使用。

json_compatible.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    runes := []rune{'A', '"', '\\', '\n', '世'}
    
    fmt.Print("[")
    for i, r := range runes {
        if i > 0 {
            fmt.Print(", ")
        }
        fmt.Print(strconv.QuoteRuneToASCII(r))
    }
    fmt.Println("]")
}

我们创建了一个类似 JSON 的带引号 Rune 数组。特殊字符会得到正确转义,使输出成为有效的 JSON。这演示了实际用法。

性能注意事项

对于性能关键的代码,了解 Rune 引用的开销很重要。此示例对 QuoteRuneToASCII 进行了基准测试。

performance.go
package main

import (
    "fmt"
    "strconv"
    "time"
)

func main() {
    const iterations = 1000000
    testRunes := []rune{'A', '世', '\n', '\U0001F600'}
    
    start := time.Now()
    for i := 0; i < iterations; i++ {
        for _, r := range testRunes {
            strconv.QuoteRuneToASCII(r)
        }
    }
    fmt.Println("QuoteRuneToASCII duration:", time.Since(start))
}

基准测试显示了引用不同 Rune 类型的性能。ASCII Rune 的引用速度比非 ASCII Rune 快。如果需要,可以考虑缓存结果。

实际示例:Rune 转义器

这个实际示例演示了如何使用 QuoteRuneToASCII 创建一个 Rune 转义器函数以实现安全输出。

rune_escaper.go
package main

import (
    "fmt"
    "strconv"
)

func escapeRunes(input string) string {
    var result string
    for _, r := range input {
        result += strconv.QuoteRuneToASCII(r)
    }
    return result
}

func main() {
    testString := "Hello\n世界🚀"
    fmt.Println("Original:", testString)
    fmt.Println("Escaped:", escapeRunes(testString))
}

我们创建了一个可以转义字符串中所有 Rune 的函数。输出显示了每个字符是如何被安全表示的。这对于调试或日志记录很有用。

来源

Go strconv 包文档

本教程通过各种场景下的 Rune 到字符串转换的实际示例,涵盖了 Go 中的 strconv.QuoteRuneToASCII 函数。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Go 教程