以XML存储值NUL(ASCII)

问题描述 投票:1回答:4

是否有可能像这样<data>*NUL**NUL**NUL*</data>将ASCII NUL字符保存为XML?

[我知道我可以使用System.out.println("\0")在Java中显示此值,并且我想知道XML是否可以处理此值。

*我的目标是使用Java从XML中获得“ \ 0 \ 0 \ 0”

谢谢您!

java xml
4个回答
3
投票

根据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'写入多字节序列。因此它可以正常读取,并且解码有效。

  • 这不是完全严格的UTF-8,需要shortest编码。
  • 我仍然不确定处理XML DOM的C语言中的错误。

所以这不是一个好主意。

也请注意,二进制数据应该改为转换为Base64 ASCII。由于UTF-8不适合二进制数据。


2
投票

这些是数据看起来像的可能性,

              <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处理器可能不喜欢它,但是没有任何问题。


2
投票

我尚未阅读XML的标准,但是由于PythonElementTree抱怨它不是有效的XML字符,因此我认为XML不支持它。您可以实现转义机制,并用"\0"表示"\\0"。另一种可能性是使用常见的[[Base64编码。

在Java中,可能看起来像这样:

// 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")


0
投票
在XML 1.0和1.1中不允许NUL(U + 0000)。

来源维基百科:Valid characters in XML

注意,代码点U + 0000已分配给空控件字符,是唯一以Unicode和ISO / IEC 10646编码的字符在任何XML 1.0和1.1文档中始终无效。
© www.soinside.com 2019 - 2024. All rights reserved.