保存 .ebc 文件 (EBCDIC)

Saving a .ebc file (EBCDIC)

我正在尝试使用以下代码保存 .ebc 文件:

xquery version "1.0-ml"; 
let $file := doc("\Text.ebc")
return
xdmp:save("\TestOutput.txt", $file,
<options xmlns="xdmp:save">
<output-encoding>ascii</output-encoding>   
</options>)

我想在保存时将原文件的EBCDIC内容转换为ASCII。我在输出文件中得到奇怪的输出,而不是任何 ASCII 内容。

存储在 MarkLogic 中的任何文本或 xml 文档都以 UTF-8 编码存储。所以你的文档现在可能不是 EBCDIC,除非你以二进制格式存储它。您可以使用 xdmp:describe(doc($uri)/node()) 进行检查:如果它显示二进制节点,则它可能是 EBCDIC。如果显示文本或 XML,则为 UTF-8。现在假设您有一个包含 EBCDIC 代码点的二进制节点。

xdmp:save 函数的第三个参数采用 XML 选项元素,但任何 output-encoding 元素仅对文本或 XML 有意义。二进制就是二进制:它没有已知的编码,所以 xdmp:save 不知道如何将它转换成另一种编码。

让我们用一个 EBCDIC 代码点 0xC1 创建一个非常简单的二进制文档。这相当于 ASCII 代码点 0x41: 'A'.

xdmp:document-insert(
  'test.ebc',
  binary { xs:hexBinary('C1') })

让我们确认我们在新文档中有一个二进制节点:

xdmp:describe(doc('test.ebc')/node())
=> fn:doc("test.ebc")/binary()

现在让我们尝试保存它:

xdmp:save(
  '/tmp/test-binary.txt',
  doc('test.ebc'),
  <options xmlns="xdmp:save">
    <output-encoding>ascii</output-encoding>
  </options>)

内容:

$ od -x /tmp/test-binary.txt 
0000000 001a                                                        
0000001

如果我们不使用 output-encoding 选项,它仍然是 C1。所有这些只是证实我们不能依赖二进制内容的 output-encoding 选项。

那么我们如何在MarkLogic中将EBCDIC转换为ASCII呢?最好的方法是在我们第一次插入来自任何地方的文档时获得正确的编码。 xdmp:document-get等函数支持输入编码选项,支持HTTP的函数可以使用Content-Type头。

但是如果你有一大块未解码的二进制文件,你仍然可以用 https://docs.marklogic.com/xdmp:binary-decode

来处理它
xdmp:binary-decode(
  doc('test.ebc'),
  'ebcdic-xml-us')

EBCDIC 似乎有大约 100 种变体,所以我只选择了一种。正如预期的那样,输出是 xs:string "A"。您现在可以将该字符串包装在某些 XML 或文本节点中,并使用 xdmp:document-insertxdmp:save.

保留它
xdmp:save(
  '/tmp/test-binary.txt',
  text {
    xdmp:binary-decode(doc('test.ebc'), 'ebcdic-xml-us') },
  <options xmlns="xdmp:save">
    <output-encoding>ascii</output-encoding>
  </options>)

正如预期的那样,输出文件包含 ASCII 格式的字母 A。我也可以将 output-encoding 选项取消为 xdmp:save,然后它将是 UTF-8。在这种情况下,这没有任何区别,但对于真实文档,它可能会有所不同。