是否有可能像这样<data>*NUL**NUL**NUL*</data>
将ASCII NUL字符保存为XML?
[我知道我可以使用System.out.println("\0")
在Java中显示此值,并且我想知道XML是否可以处理此值。
*我的目标是使用Java从XML中获得“ \ 0 \ 0 \ 0”
谢谢您!
根据specs for 1.0,它将不会被正式允许。
ASCII NUL aka'\0'
aka \u0000
是Java中的普通字符。但是在C / C ++中,它用作字符串终止符。因此,当C软件处理XML时,它可能太早检测到XML文本的结尾。
为此Java也有一个解决方案,即以UTF-8编码编写XML时,Unicode值> 127以多字节序列的第8位1进行编码。DataOutputStream.writeUTF8
也将'\ 0'写入多字节序列。因此它可以正常读取,并且解码有效。
所以这不是一个好主意。
也请注意,二进制数据应该改为转换为Base64 ASCII。由于UTF-8不适合二进制数据。
这些是数据看起来像的可能性,
<row>
<data>actual data</data>
</row>
<row>
<!--null using attr. n ="t"-->
<data n="t"></data>
</row>
<row>
<!--some other meaning-->
<data/>
</row>
编辑:如果要表示多个空值,请使用属性路由并更改属性以表示多少个空值。
<row>
<!--null using attr. n ="3"-->
<data n="3"></data>
</row>
在示例中为三个空值。
编辑:这是有效的XML
<row>
<data>\0</data>
</row>
您的XML处理器可能不喜欢它,但是没有任何问题。
我尚未阅读XML的标准,但是由于Python的ElementTree抱怨它不是有效的XML字符,因此我认为XML不支持它。您可以实现转义机制,并用"\0"
表示"\\0"
。另一种可能性是使用常见的[[Base64编码。
// write data to element
String data = ...
element.setText(Base64.getEncoder().encodeToString(data.getBytes("UTF-8")))
// read data from element
String data = new String(Base64.getDecoder().decode(element.getText())), "UTF-8")
来源维基百科:Valid characters in XML
注意,代码点U + 0000已分配给空控件字符,是唯一以Unicode和ISO / IEC 10646编码的字符在任何XML 1.0和1.1文档中始终无效。