Java代码意外地将“&#13”附加到行尾

我们的代码出乎意料地追加&#13到由以下例程创build的行的末尾:

 public String getNotation(ClientMessage TransactionMessage) { StringBuffer sb = new StringBuffer(); String lineSeparator = System.getProperty("line.separator"); String osName = System.getProperty("os.name").toLowerCase(); sb.append(getNotationTitle(TransactionMessage)); sb.append(lineSeparator); sb.append(lineSeparator); 

只有当代码在Windows Server 2008上运行时,“line.separator”似乎才会被转换为string&#13 。 当我们在Windows 7或UNIX上运行时,它运行良好。

有没有人遇到这个问题,如果有的话,是否有任何合理的解释和解决scheme来纠正?

HTTP(和其他文本互联网协议)强制使用ASCII CR+LF作为换行符CR是“回车”字符( \r ), LF是“换行符”( \n )。

这个转义序列 – \r\n也是在Windows系统上使用的文件分隔符,因此是您调用System.getProperty("line.separator") ,然后通过调用将其附加到sb.append(lineSeparator)到输出字符串。 这是发生在你的测试和“代码在实际的服务器上执行” – 在这两种情况下(我推测),代码正在你的Windows服务器上执行 ,从而产生相同的字符串。

正如你所建议的,这个序列并没有被翻译成&#13 。 如果是这样的话,那么你的整个输出将会出现在一行中,插入&#13地方就是换行符。 然而,听起来并不是这样的 – 听起来你正在得到你想要的那些换行符,但是在每一行的结尾都出现了一个意想不到的结果。

当我们认识到单独的\n足以在大多数编程语言和环境中表示换行符时,这是有道理的,而13是回车符的十进制表示

我假定你的测试显示以原始字符串形式生成的字符串(也许只需要调用println(sb.toString()) ,在这种情况下\r\n被解释和显示,如你所期望的那样。

我还假定你的TransactionMessage类不是以原始字符串而是以HTML格式传输消息,因为&#13将是HTML实体代码,用于回车符的十进制表示形式。

我不能确切地告诉你为什么(至少不知道更多关于你的特定情况),但由于某种原因,LR字符正在被转换成它的十进制表示,而你选择的在客户端上显示结果字符串的方法不会将表示看作是一个控制字符,因此将其显示为正好在\n之前的文字&#13 ,这被解释为转义。

(无关的一面注意:从Java 7开始,您可以使用 System.lineSeparator() 来代替 System.getProperty("line.separator")