首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存.ebc文件(EBCDIC)

保存.ebc文件(EBCDIC)
EN

Stack Overflow用户
提问于 2015-01-27 08:44:59
回答 1查看 547关注 0票数 0

我试图使用以下代码保存一个.ebc文件:

代码语言:javascript
复制
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内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-27 17:30:57

存储在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‘。

代码语言:javascript
复制
xdmp:document-insert(
  'test.ebc',
  binary { xs:hexBinary('C1') })

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

代码语言:javascript
复制
xdmp:describe(doc('test.ebc')/node())
=> fn:doc("test.ebc")/binary()

现在让我们试着保存它:

代码语言:javascript
复制
xdmp:save(
  '/tmp/test-binary.txt',
  doc('test.ebc'),
  <options xmlns="xdmp:save">
    <output-encoding>ascii</output-encoding>
  </options>)

内容:

代码语言:javascript
复制
$ od -x /tmp/test-binary.txt 
0000000 001a                                                        
0000001

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

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

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

代码语言:javascript
复制
xdmp:binary-decode(
  doc('test.ebc'),
  'ebcdic-xml-us')

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

代码语言:javascript
复制
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。在这种情况下,这并没有什么区别,但是对于真正的文档,它可能会产生影响。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28166317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档