理解字符串转义序列
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 开始。通过为程序提供确定性的输出,这使得缓存程序变得更加容易。以上是关于理解字符串转义序列的主要内容,如果未能解决你的问题,请参考以下文章