gpt4 book ai didi

xml - 将包含中文字符的 XML 发布到 Microsoft Translator API 会引发反序列化异常

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:41 24 4
gpt4 key购买 nike

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

一些要求

  • 我必须使用 HTTP 方法 POST,而不是使用 GET 和查询字符串,因为我的查询超出了 Microsoft 的 URI 15,845 个字符的限制(请注意,这是即使我使用的中文字符少于 10,000 个字符限制也是可能的。原因是查询字符串必须进行 URL 编码,这会大大增加长度,但在确定字符数之前,它会被 Microsoft 解码。

  • The only translate HTTP method that allows POSTs is the TranslateArrayMethod ,例如TranslateMethod 仅允许 GET。不幸的是,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>

这工作正常,结果是:

<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>

但是,如果我添加任何汉字,如下所示:

<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>

我收到一个奇怪的回复:

<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>

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

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

最佳答案

好的,我在从 Node.js 调用 Microsoft Translator POST API 之一时遇到了完全相同的问题。 API 工作正常 - 只要没有非 ASCII 字符,就会按预期返回翻译,但是当我将单个重音“é”字符添加到适当的 <string> 时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>

我发现问题在于 Content-Length header 想要以字节为单位的长度,但我一直在发送以字符为单位的长度。为什么会出现这种情况?那么,测量 Node http 请求正文长度的典型方法是调用

var length = body.length

并获取字符串的“长度”,即字符数。当所有字符都是 ASCII 时,此方法有效。然而,事实证明,在 UTF-8 中,非 ASCII 字符(包括我的重音“é”)每个字符可以超过一个字节。因此,当正文包含非 ASCII 字符时,字节长度将不再等于字符长度,并且字符长度不正确。在本例中,它导致 Microsoft 服务器过早停止读取消息,从而生成错误消息。

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

var length = Buffer.byteLength(body, 'utf8')

并将该长度发送到 Content-Length header ,并且 Microsoft Translator API 再次工作。

关于xml - 将包含中文字符的 XML 发布到 Microsoft Translator API 会引发反序列化异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31423796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com