我们在使用WEB Service时,需要注意的一点是,传递过程中会丢失一些字符,比较典型的是 /r/n 中 /r 回车字符会被丢弃。这是XML规范所导致的问题。XML规范关于这部分的描述如下:
2.11 行尾处理
为编辑的方便起见,存储XML已析实体的计算机文件经常用行来组织。通常这些行用回车符(#xD)和换行符(#xA)的一些组合来分隔。
为了使应用的工作简单化,对于一个外部已析实体或内部已析实体的常量实体值中包含的任何两字符常量序列"#xD#xA"或单独的常量#xD,XML处理器都应换成#xA传递给应用。(这可以通过在进行语法分析前将所有行分隔符规范成#xA而方便地实现。)
\r 回车(跑到最前面)
\n 换行(下一行)
参考资料:
WebServices eat \r in \r\n
http://vidmar.net/weblog/archive/2005/04/03/1203.aspx
XML规范对此相关的解释
http://www.w3.org/TR/2004/REC-xml-20040204/#sec-line-ends
中文版的介绍看下面地址:
http://xml.coverpages.org/xml10-chinese.html#sec-line-ends
\r\n和\r
http://topic.csdn.net/t/20060317/09/4620216.html
Web Service - Carriage Return
http://forums.msdn.microsoft.com/en-US/netfxremoting/thread/bb0ff1f8-0300-4910-be10-6594dff56de4
打印 | 张贴于 2008-06-06 17:30:58 | Tag:.net 编程心得 技术随笔 网站开发管理相关内容 .net 3.5 .net 3.0
留言反馈
Environment.NewLine在MSDN内的描述为“获取为此环境定义的换行字符串”
备注描述为"NewLine 的属性值是一个专门为当前平台和 .NET Framework 实现而自定义的常数。有关属性值中转义字符的更多信息,请参见 字符转义。
NewLine 提供的功能常常是换行符 (newline)、换行符 (line feed)、分行符、回车符、CRLF 和行尾等术语表示的含义。
NewLine 可以与语言特定的换行支持一起使用,如 Microsoft C# 和 C/C++ 中的“\r”和“\n”,或 Microsoft Visual Basic 中的 vbCrLf
"
但是Reflector查看.net framework的实现代码为:
public static string NewLine
{
get
{
return "\r\n";
}
}
Gets the newline string defined for this environment.
Return Value
A string containing "\r\n" for non-Unix platforms, or a string containing "\n" for Unix platforms.
这又是什么原因呢?并没有看到对当前平台的判断,而是直接返回的。
我以前写代码都是用Environment.NewLine自以为可能(其实可能性很小)将来系统迁移到*Unix下不会有问题,但Reflector看了后又迷惑了。
而 windows 上如果稍不留意,就会有问题。
比如我这里, 我写的代码那里忘了考虑这种情况,结果处理普通文本转html哪里就出了问题。 这次查这个问题的时候,才发现这个规范。
win上是 \r\n
*unix上是 \n