Skip to content

Latest commit

 

History

History
45 lines (25 loc) · 2.63 KB

20160817-解决iOS和Android输出的换行数量不一致的问题.md

File metadata and controls

45 lines (25 loc) · 2.63 KB

解决iOS和Android输出的换行数量不一致的问题

[时间:2016.08.17] [作者:@JeffreySu] [关键字:iOS,Android,换行]

不同系统中的换行符

首先我们先来科普一下不同操作系统的换行符:

  1. 在Windows下,换行符是CRLF,即\r\n0d0a,如果再深究,\r是行末标记(return,Carriage Return),\n是行首标记(newline,Line Feed)。

  2. 在Linux和Unix下,换行符是LF,即\n0a

  3. 在Mac(OS 9-)下,换行符是CR,即\r0d

  4. 在Mac(10+)下,换行符是LF\n0a

我们有时在Windows中打开其他操作系统的文件会发现原本换行的文字都变成了一行,就是这个原因。

我们都知道,Android实际上是基于Linux开发的,而iOS是基于Darwin开发的,Darwin是Unix的一个分支。

转换问题

明白了不同系统对于换行符的定义之后,我们就可以还原这样的场景:

  1. 假设微信的服务器基于Linux,那么他所识别的换行符是\n,当包含这个换行符的消息到达Windows的服务器(假设开发者使用的是C#), 那么系统会将这个换行符输出为\r\n,这样C#内部是可以正常读取的。

  2. 当C#希望输出一个换行符返回给客户端的时候,它会先推送到微信的服务器(不管是原先的信息还是自己编辑的),默认的换行符是\r\n, 当微信收到这个换行符的时候,他不会将其转为\n,因为这个内通常被包含在XML中作为字符串转发给微信客户端。

  3. 差别就在这个时候发生了。客户端无论使用什么手机操作系统,收到的换行符都是\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