\n和\r\n

作者: 纵横而乐 | 来源:发表于2022-08-20 22:15 被阅读0次

    在学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呢?

    这个问题其实可以从侧面来探究,如果查看一个mac上的文本文件,可以看到其对应换行位置的字段编码是line feed(0a),比如这个文件 文件示例
    hexdump -x 文件

    得到第十二个位置的字符utf8编码为0a即line feed的ascii编码(二进制展示使用的是小端编码,所以第11个位置的0a即第12个字符的编码,第12个编码0x68是字符h的编码)


    文件二进制编码

    相关文章

      网友评论

          本文标题:\n和\r\n

          本文链接:https://www.haomeiwen.com/subject/ttrbgrtx.html