Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将带有汉字的XML发布到Microsoft Translator API会引发反序列化异常_Xml_Node.js_Translation_Chinese Locale_Microsoft Translator - Fatal编程技术网

将带有汉字的XML发布到Microsoft Translator API会引发反序列化异常

将带有汉字的XML发布到Microsoft Translator API会引发反序列化异常,xml,node.js,translation,chinese-locale,microsoft-translator,Xml,Node.js,Translation,Chinese Locale,Microsoft Translator,我正在尝试使用Microsoft Translator API将中文(简体)翻译成英文 几个要求 我必须使用HTTP方法POST,而不是GET和查询字符串,因为我的查询超过了Microsoft的URI限制15845个字符(请注意,即使我使用的汉字少于10000个字符的限制,这也是可能的。原因是查询字符串必须是URL编码的,这大大增加了长度,但在确定字符数之前,它由Microsoft解码 例如,TranslateMethod只允许GETs。不幸的是,TranslateArrayMethod只接受

我正在尝试使用Microsoft Translator API将中文(简体)翻译成英文

几个要求

  • 我必须使用HTTP方法
    POST
    ,而不是
    GET
    和查询字符串,因为我的查询超过了Microsoft的URI限制15845个字符(请注意,即使我使用的汉字少于10000个字符的限制,这也是可能的。原因是查询字符串必须是URL编码的,这大大增加了长度,但在确定字符数之前,它由Microsoft解码

  • 例如,
    TranslateMethod
    只允许
    GET
    s。不幸的是,
    TranslateArrayMethod
    只接受XML文档,因此我必须使用XML

以下是我正在发送的XML文档示例:

<TranslateArrayRequest>
    <AppId/>
    <From>es</From>
    <Options>
        <ContentType xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2">text/plain</ContentType>
    </Options>
    <Texts>
        <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <![CDATA[Hola]]>
        </string>
    </Texts>
    <To>en</To>
</TranslateArrayRequest>

锿
文本/纯文本
EN
这很好,结果是:

<ArrayOfTranslateArrayResponse xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<TranslateArrayResponse>
    <From>es</From>
    <OriginalTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <a:int>4</a:int>
</OriginalTextSentenceLengths>
<TranslatedText>Hello</TranslatedText>
<TranslatedTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<a:int>5</a:int>
</TranslatedTextSentenceLengths>
</TranslateArrayResponse>
</ArrayOfTranslateArrayResponse>

锿
4.
你好
5.
但是,如果我再添加任何汉字,如:

<TranslateArrayRequest>
    <AppId/>
    <From>zh-CHS</From>
    <Options>
        <ContentType xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2">text/plain</ContentType>
    </Options>
    <Texts>
        <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <![CDATA[南]]>
        </string>
    </Texts>
    <To>en</To>
</TranslateArrayRequest>

zh CHS
文本/纯文本
EN
我得到一个奇怪的回答:

<html>
    <body/>
    <h1>System.Runtime.Serialization.SerializationException</h1>
    <p>Message: There was an error deserializing the object of type Microsoft.MT.MDistributor.V2.TranslateArrayRequest. Unexpected end of file. Following elements are not closed: TranslateArrayRequest. Line 1, position 298.</p>
</html>

System.Runtime.Serialization.SerializationException
消息:反序列化Microsoft.MT.MDistributor.V2.TranslateArrayRequest类型的对象时出错。意外的文件结尾。以下元素未关闭:TranslateArrayRequest。第1行,位置298

请注意,我也尝试过不使用CDATA转义,但没有帮助。从语言更改
,也没有效果


我正在使用Node.js(Javascript),尽管这是一个通用HTTP API,我认为这不重要。

最可能的问题不是中文,而是MS Translator不喜欢新的行符号。当我无意中发现此错误消息时,我更改了以下内容:

  • 在节点的每个内容中,用空字符串替换新行字符。这些字符具有Unicode值:0xA、0xB、0xC、0xD、0x85、0x2028、0x2029
  • 在节点的每个内容中,用XML保留字的替代表示形式替换了XML保留字:

    &→ &

    <→

    >→

    "→ &载脂蛋白

    "→ "

  • 将整个XML重新排列为一行

  • 在那之后,一切都很顺利。关于你的例子,符号“南翻译成“南方”"。我没有使用CDATA转义。

    好的,我在Node.js中调用一个Microsoft Translator POST API时遇到了完全相同的问题。只要没有非ASCII字符,该API就可以正常工作-返回预期的翻译结果,但当我在在POST主体中,它会以错误响应:

        <html><body/><h1>System.Runtime.Serialization.SerializationException</h1>
    <p>Message: There was an error deserializing the object of type Microsoft.MT.MDistributor.V2.TranslateArrayRequest. Unexpected end of file. Following elements are not closed: TranslateArrayRequest. Line 1, position 782.</p>
    </html>
    
    并获取字符串的“长度”(即字符数)。当所有字符都是ASCII字符时,这种方法有效。但是,在UTF-8非ASCII字符中(包括我的重音“é”)每个可以超过一个字节。因此,当正文包含非ASCII字符时,字节长度将不再等于字符长度,并且字符长度不正确。在这种情况下,它会导致Microsoft服务器过早停止读取消息,从而生成错误消息

    相反,我们需要通过调用(在Node.js中)测量长度(以字节为单位)


    然后在
    内容长度
    标题中发送该长度,Microsoft Translator API将再次工作。

    您是如何构造XML的?您是使用库/API还是进行字符串篡改?如果是后者,则
    声明中声明的编码是否与您使用的实际编码匹配?@Damien字符串混乱。我没有添加任何xml声明,因为这导致API的响应为空。我尝试再次将
    添加到顶部,它返回一个空响应,状态代码为400,标题为
    {“content length:“0”,“date:“Wed,Jul 2015 08:41:54 GMT”,“connection:“close”}
    。事实上,我使用的是node.js,响应的
    数据
    事件从未触发,因此服务器从未发送任何数据-它关闭连接时没有任何响应,状态代码为400。@Damien\u不信者注意,Microsoft也没有在其xml输入中添加此xml声明标记,请注意,并非所有重音字母在UTF-8中占2个字节ẘ, 占用3个字节。
    var length = body.length
    
    var length = Buffer.byteLength(body, 'utf8')