[时间:2016.08.17] [作者:@JeffreySu] [关键字:iOS,Android,换行]
首先我们先来科普一下不同操作系统的换行符:
-
在Windows下,换行符是
CRLF
,即\r\n
或0d0a
,如果再深究,\r
是行末标记(return,Carriage Return),\n
是行首标记(newline,Line Feed)。 -
在Linux和Unix下,换行符是
LF
,即\n
或0a
。 -
在Mac(OS 9-)下,换行符是
CR
,即\r
或0d
。 -
在Mac(10+)下,换行符是
LF
即\n
或0a
。
我们有时在Windows中打开其他操作系统的文件会发现原本换行的文字都变成了一行,就是这个原因。
我们都知道,Android实际上是基于Linux开发的,而iOS是基于Darwin开发的,Darwin是Unix的一个分支。
明白了不同系统对于换行符的定义之后,我们就可以还原这样的场景:
-
假设微信的服务器基于Linux,那么他所识别的换行符是
\n
,当包含这个换行符的消息到达Windows的服务器(假设开发者使用的是C#), 那么系统会将这个换行符输出为\r\n
,这样C#内部是可以正常读取的。 -
当C#希望输出一个换行符返回给客户端的时候,它会先推送到微信的服务器(不管是原先的信息还是自己编辑的),默认的换行符是
\r\n
, 当微信收到这个换行符的时候,他不会将其转为\n,因为这个内通常被包含在XML中作为字符串转发给微信客户端。 -
差别就在这个时候发生了。客户端无论使用什么手机操作系统,收到的换行符都是
\r\n
,但也可能是是微信客户端处理方式的不同,当系统为iOS(Unix)的时候, 他会理解为需要换两次行(猜测\n
等于已经敲了一个回车,而\r
又敲了一个回车),这样原本在Windows上面的1个换行最终就让iOS出现了2个换行。而对于Android(Linux)来说,微信客户端对
\r\n
的理解会只识别一个\n,因此还是只换了1行。
了解了上面的原理和过程之后,我们就可也有办法处理这个问题了,比如开发者使用的是基于Windows的C#,那么在最终输出给微信服务器的XML中,
将\r\n
替换为\n
即可,这样Linux和Unix都只理解为1个换行。
而如果是基于Linux服务器的Java或PHP等语言开发,我们可以忽略这个问题,因为输出的\n在Windows(PC和手机系统)都会被理解并输出为1个换行。
http://stackoverflow.com/questions/426397/do-line-endings-differ-between-windows-and-linux