理解字符串转义序列

Posted

技术标签:

【中文标题】理解字符串转义序列【英文标题】:Understanding string escape sequences 【发布时间】:2018-06-19 07:41:15 【问题描述】:

我是新手,所以对字节概念有很多困惑。

在浏览一些 go 代码时,我遇到了类似的东西

[]byte("\xd2\xfd\x88g\xd5\r-\xfe")

是十六进制还是字节格式?

上面的 g,r-,e 之类的字符是什么意思?

以及如何在日志中打印?

【问题讨论】:

您的标题提到了字节缓冲区,但您的问题根本没有提到缓冲区,实际问题甚至与字节无关。所以我更新了你的标题以匹配问题。 The Go Blog: Strings, bytes, runes and characters in Go 【参考方案1】:

[]byte("\xd2\xfd\x88g\xd5\r-\xfe") 是一个解释字符串文字,转换为[]byte 类型,一个byte 切片。这里它被分成字节值:

[\xd2, \xfd, \x88, g, \xd5, \r, -, \xfe]

或者,以十六进制字节表示,

[d2, fd, 88, 67, d5, 0d, 2d, fe]

一种记录值的方法,

package main

import "log"

func main() 
    b := []byte("\xd2\xfd\x88g\xd5\r-\xfe")
    log.Printf("%q\n", b)

游乐场:https://play.golang.org/p/BIh_EuvoxU-

输出:

2009/11/10 23:00:00 "\xd2\xfd\x88g\xd5\r-\xfe"

The Go Programming Language Specification


String literals

字符串字面量表示一个字符串常量,从 连接一系列字符。有两种形式:原始 字符串文字和解释的字符串文字。

原始字符串文字是反引号之间的字符序列,如 foo。在引号内,可以出现除反引号外的任何字符。 原始字符串文字的值是由 之间的未解释(隐式 UTF-8 编码)字符 引号;特别是,反斜杠没有特殊含义,并且 字符串可能包含换行符。里面的回车符('\r') 原始字符串文字会从原始字符串值中丢弃。

解释的字符串字面量是 double 之间的字符序列 引号,如“bar”。在引号内,可以出现任何字符 除了换行符和未转义的双引号。引号之间的文字 形成文字的值,反斜杠转义解释为 它们是符文文字(除了 \' 是非法的和 \" 是合法的), 具有相同的限制。三位八进制 (\nnn) 和两位 十六进制 (\xnn) 转义表示结果的单个字节 细绳;所有其他转义表示(可能是多字节)UTF-8 单个字符的编码。因此在字符串文字 \377 和 \xFF 表示值 0xFF=255 的单个字节,而 ÿ, \u00FF, \U000000FF 和 \xc3\xbf 代表 UTF-8 的两个字节 0xc3 0xbf 字符 U+00FF 的编码。


在反斜杠之后,某些单字符转义表示特殊 价值观:

\a   U+0007 alert or bell
\b   U+0008 backspace
\f   U+000C form feed
\n   U+000A line feed or newline
\r   U+000D carriage return
\t   U+0009 horizontal tab
\v   U+000b vertical tab
\\   U+005c backslash
\'   U+0027 single quote  (valid escape only within rune literals)
\"   U+0022 double quote  (valid escape only within string literals)

【讨论】:

等一下,输出中的日期是从哪里来的? @MarcoBonelli:The Go Playground:关于操场:操场上的时间从 2009 年 11 月 10 日 23:00:00 UTC 开始。通过为程序提供确定性的输出,这使得缓存程序变得更加容易。

以上是关于理解字符串转义序列的主要内容,如果未能解决你的问题,请参考以下文章

学习转义序列和转义符

学习转义序列和转义符

C++特殊字符转义序列

请求筛选模块被配置为拒绝包含双重转义序列的请求.啥意思

ANSI 颜色转义序列字符出现在 String.length();

转义序列与空白字符(\s)[重复]