通过带有OpenURL命令的Java WebAgent接收POST时,Lotus更改的字符

YdB:

我在Lotus-Domino中有一个Java WebAgent,它通过OpenURL命令(https://link.com/db.nsf/agentName?openagent)运行。创建此代理是为了接收带有XML内容的POST。在甚至解析或保存(XML)内容之前,Web代理将内容保存到内存文档中:

对于使用OpenAgent URL命令从浏览器运行的代理,内存中文档是一个新文档,其中包含Domino®支持的每个CGI(通用网关接口)变量的项目。每个项目都有受支持的CGI变量的名称和当前值。(您无需进行任何设计工作; CGI变量将自动可用。)https://www.ibm.com/support/knowledgecenter/zh-CN/SSVRGU_9.0.1/basic/H_DOCUMENTCONTEXT_PROPERTY_JAVA.html

POST的内容将(由Lotus)保存到该request_content字段中。接收带有以下字符的内容时:é,例如:

 <Name xml:lang="en">tést</Name>

Lotus将é更改为?®。这也是我在读取request_content文档属性中字段时看到的是否可以将é另存为é,而不是a :?在Lotus中?

解决方案

我修复它的方法是通过这篇文章:

链接可以帮助我解决这个问题

解决方案但是在Java中:

 /****** INITIALIZATION ******/
              session = getSession();
              AgentContext agentContext = session.getAgentContext();

              Stream stream = session.createStream();
              stream.open("C:\\Temp\\test.txt", "LMBCS");
        stream.writeText(agentContext.getDocumentContext().getItemValueString("REQUEST_CONTENT"));
              stream.close();
              stream.open("C:\\Temp\\test.txt", "UTF-8");
              String Content = stream.readText();
              stream.close();
              System.out.println("Content: " + Content);
理查德·施瓦兹(Richard Schwartz):

我之前已经处理过,但是我不再有权访问代码,因此必须从内存中进行工作。

这看起来像是UTF-8与UTF-16的问题,但是最多可以使用五个字符集:执行POST的代码中使用的字符集,运行代理的JVM的字符集, Domino服务器代码,NSF的字符集(始终为LMBCS)以及Domino服务器的主机OS的字符集。

如果我没记错的话,REQUEST_CONTENT将被视为原始数据,而不是字符数据。为了正确处理,您必须自己处理REQUEST_CONTENT的转换。

用于在Java代理中保存数据的Notes API调用将自动从Unicode转换为LMBCS,反之亦然,但这仅在Java正确解释了传入数据流的情况下有效。我认为在大多数情况下,在Domino下运行的JVM是针对UTF-16配置的-尽管事实并非如此。(我记得日本一台服务器的问题,其中一个字符集是JIS标准字符集之一,但是我不记得它是否在JVM中。)

因此,如果我没记错的话,您需要使用来将REQUEST_CONTENT作为UTF-8从String读入字节数组getBytes("UTF-8"),然后使用来从字节数组构造新的String new String(byte[] bytes, "UTF-16")假设然后将那个字符串传递给,NotesDocument.ReplaceItemValue()那么Notes API调用应该正确地解释它。

我可能在这里有一些细节错误。有一阵子了。我很久以前建立了一个数据库,该数据库显示了多年前所有Unicode字符的LMBCS,UTF-8和UTF-16值。如果您可以深入了解字节值,那么它可以是查看此类数据并弄清实际情况的有用工具。这是从这里下载OpenNTF在这种情况下,我回想起编写了获取字节数组并将其转换为十六进制并将其写入NotesItem的代码,以便我可以准确地看到即将出现的内容并将其与数据库条目进行比较。

而且,是的,根据评论,如果让双方的XML工具都可以处理字符集问题和编码,那就更好了,但这并不总是万无一失的。您将在流程中添加另一层字符集!您必须正确处理。如果目标是将数据存储在NotesItems中,则仍然必须确保服务器端XML工具解码为正确的字符集,这可能不是默认的字符集。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何通过Powershell在其参数中运行带有管道字符的命令?

朱莉娅:无法通过字符串变量运行带有参数的命令

通过child_process执行命令时,如何处理带有节点的输入提示?

Bash-为什么我只能通过“ bash -c”执行带有管道的命令字符串?

带有'特殊字符的sed命令

通过带有Java代码的Appium控制时,无法在Outlook邮件上使用findElementByName

错误:编译带有多个类的.Java文件后,使用Java命令时找不到或加载主类

当我有 HTTP 代理时,如何通过带有 paho 的 websocket 发送 MQTT?(Java客户端)

使用 RestTemplate 时无法在 LinkedHashMap 中接收带有字符串的 UTF-8 格式

SIM7000E-带有AT命令的HTTP POST

带有 Powershell 捕获输出的路由更改命令

带有 PS1 更改的 Linux 脚本命令

如何使用带有特殊字符的echo命令

如何使用带有特殊字符的SQL LIKE命令?

从带有参数的字符串运行命令

bash:使grep命令忽略带有某些特殊字符$(

grep带有连字符选项的命令的手册页

Bash:带有代表字符的变量的tr命令

bash多行命令,在连续字符后带有注释

grep带有连字符选项的命令的手册页

带有stat命令的权限脚本麻烦awk特殊字符

带有管道字符的终端上的自定义命令

通过带有 tox 的命令设置 $PATH

通过带有cURL的HTTP Post将XML字符串发送到Web服务

通过AngularJS发送带有多个数据的HTTP Post

通过方法 post 发出带有参数的 HttpsURLConnection 请求

通过chrome扩展程序发送带有post方法的文本

带有Curl的php:通过POST执行重定向

通过单击更改带有垫图标的按钮的颜色