在学Swift基本类型的时候发现在String Interpolation这部分有这样一段话
print(#"6 times 7 is \#(6 * 7)."#)
// Prints "6 times 7 is 42."
NOTE
The expressions you write inside parentheses within an interpolated string can’t contain an unescaped backslash (), a carriage return, or a line feed. However, they can contain other string literals.
在Note中有两个概念即"carriage return"和"line feed",分别代表\r和\n字符
在stackoverflow上的讨论是这样讲的
A line feed means moving one line forward. The code is \n.
A carriage return means moving the cursor to the beginning of the line. The code is \r
\n和\r在ASCII表中的值分别是0x0A和0x0D
从stackoverflow上的回答可以看出在windows平台换行的字符是"\r\n",在类UNIX平台代表换行的字符是"\n"
这里的换行可以形象在理解为除光标之外现有所有字符向上移动一行,同时光标回到行首,回到打字机的时代,就比较好理解这个概念了,因为这其实是两步,一步是纸张上移一行,一步是光标回行首
所以Note中的意思是如果字符串中包含了carriage return,或者line feed 是不被允许的行为,比如在行尾敲击回车键的话,XCode提示如下:
未转义的反斜杠符不能出现在字符串中.png 换行符不可能出现在字符串中.png
这里其实又衍生出另外一个问题,敲击回车键之后,触发的字符究竟是\r还是\n还是\r\n呢?
hexdump -x 文件
得到第十二个位置的字符utf8编码为0a即line feed的ascii编码(二进制展示使用的是小端编码,所以第11个位置的0a即第12个字符的编码,第12个编码0x68是字符h的编码)
文件二进制编码
网友评论