ZetCode

Golang strconv.QuoteRuneToGraphic

最后修改于 2025 年 4 月 20 日

本教程解释了如何在 Go 中使用 strconv.QuoteRuneToGraphic 函数。我们将通过实际示例涵盖 Rune 引用的基础知识。

strconv.QuoteRuneToGraphic 函数将一个 Rune 引用为 Go 字符串字面量。它返回一个单引号的 Go 字符字面量。

该函数与 strconv.QuoteRune 类似,但只转义非图形字符。图形字符包括字母、标记、数字、标点符号和符号。

基本的 strconv.QuoteRuneToGraphic 示例

strconv.QuoteRuneToGraphic 最简单的用法是引用一个图形 Rune。这里我们用常见字符演示基本用法。

basic_quote.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    r := 'A'
    quoted := strconv.QuoteRuneToGraphic(r)
    fmt.Printf("Original: %U, Quoted: %s\n", r, quoted)
    
    r = '☺'
    quoted = strconv.QuoteRuneToGraphic(r)
    fmt.Printf("Original: %U, Quoted: %s\n", r, quoted)
}

我们引用了两个图形 Rune:'A' 和笑脸 '☺'。输出显示了原始 Unicode 代码点和引用的字符串表示。

引用非图形字符

strconv.QuoteRuneToGraphic 会转义非图形字符。此示例展示了如何处理控制字符。

non_graphic.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    testRunes := []rune{'\n', '\t', 0x7F, ' '}
    
    for _, r := range testRunes {
        quoted := strconv.QuoteRuneToGraphic(r)
        fmt.Printf("%U: %s\n", r, quoted)
    }
}

我们测试了各种非图形 Rune,包括换行符、制表符、DEL 和空格。该函数使用 Go 转义序列对它们进行转义。

比较 QuoteRune 和 QuoteRuneToGraphic

此示例演示了 QuoteRuneQuoteRuneToGraphic 对于不同类型 Rune 的区别。

compare_quote.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    runes := []rune{'a', '\n', '☺', 0x7F}
    
    for _, r := range runes {
        q1 := strconv.QuoteRune(r)
        q2 := strconv.QuoteRuneToGraphic(r)
        fmt.Printf("%U: QuoteRune=%s, QuoteRuneToGraphic=%s\n", 
            r, q1, q2)
    }
}

QuoteRuneQuoteRuneToGraphic 转义的字符更多。后者仅转义非图形字符,而将图形字符保持原样。

处理 Unicode 增补平面

QuoteRuneToGraphic 能正确处理来自 Unicode 增补平面的 Rune。此示例展示了对表情符号和其他高平面字符的引用。

unicode_planes.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    highPlaneRunes := []rune{'🦄', '𐍈', '😀'}
    
    for _, r := range highPlaneRunes {
        quoted := strconv.QuoteRuneToGraphic(r)
        fmt.Printf("%U: %s\n", r, quoted)
    }
}

该函数能正确引用增补平面中的表情符号和古代字符。这些被视为图形字符,不会被转义。

处理无效的 UTF-8

此示例展示了 QuoteRuneToGraphic 在转换 Rune 时如何处理无效的 UTF-8 序列。

invalid_utf8.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // Invalid UTF-8 sequence
    invalidRune := rune(0xDC00) // Lone surrogate
    
    quoted := strconv.QuoteRuneToGraphic(invalidRune)
    fmt.Printf("Invalid rune quoted: %s\n", quoted)
}

该函数仍然会为无效的 UTF-8 Rune 生成输出,并根据 Go 字符串字面量规则对其进行转义。结果始终是有效的 UTF-8。

实际示例:字符转义

这个实际示例演示了如何使用 QuoteRuneToGraphic 在显示前转义用户输入中的字符。

escape_input.go
package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Enter a character: ")
    
    input, _, err := reader.ReadRune()
    if err != nil {
        fmt.Println("Error reading input:", err)
        return
    }
    
    quoted := strconv.QuoteRuneToGraphic(input)
    fmt.Printf("You entered: %s (quoted: %s)\n", string(input), quoted)
}

我们从用户输入中读取一个 Rune,并对其进行引用以安全显示。这在用户界面中显示控制字符时很有用。

性能注意事项

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

performance.go
package main

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

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

QuoteRuneToGraphic 针对性能进行了优化,但会创建新的字符串分配。对于批量处理,请考虑其他方法。

来源

Go strconv 包文档

本教程通过在各种场景下引用 Rune 的实际示例,介绍了 Go 中的 strconv.QuoteRuneToGraphic 函数。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出所有 Go 教程