HL7V2 HAPI解析器在通过TCP/IP接收数据时异常



我使用的是HAPIHAPI -structures-v25版本号2.3的库解析HL7v2消息&将其转化为FHIR资源。在通过TCP侦听器使用HAPI接收和解析HL7V2消息时,我遇到了一个奇怪的问题。

确定消息的编码。以下是消息的前50个字符供参考,虽然这可能不是问题所在:MSH|^~&|test|DrJhonDoe| test| UNKNOWN|20210216190432||ADT^A01^ADT_A01|60b647d4-b5a5-4fae-a928-d4a3849de3c8|T|2.5

奇怪的是,当我试图在main函数中将此消息作为字符串发送时,我没有得到此错误。只有当我通过TCP/IP接收到Java函数的数据时,才会出现此错误。我尝试发送HL7消息到我的接收TCP端口使用欢笑以及外部工具& &;我的结果是一样的。

这是我的HL7v2消息的示例,我试图处理

MSH|^~\&|test|Dr.JhonDoe|TEST|UNKNOWN|20210216190432.7||ADT^A01^ADT_A01|60b647d4b5a54faea928d4a3849de3c8|T|2.5
EVN||20210216|20210216|

当从tcp/ip接收数据时,我正在使用UTF-8字符集将字节转换为字符串。

InputStream in = connection.getInputStream();
OutputStream out = connection.getOutputStream();
receivedMessageSize = in.read(receivedByeBuffer);
String incomingHl7Message = new String(receivedByeBuffer, StandardCharsets.UTF_8);

我正确地理解了信息。但不确定为什么会出现错误。

正如Amit在回答中提到的,它需要在JAVA中进行转义。HL7v2通过MLLP传输时,它将<VT>, <CR>Unicode数据添加到文本中。这里需要理解的是,这些不是垃圾字符。通过MLLP协议,消息的开始和结束由这些unicode字符标记,以描述帧的开始和结束。

HAPI HL7解析不能解析这些特殊(不可打印的)字符。很高兴我在同一个论坛上找到了一个解决方案来明智地处理java。如何从java字符串中删除控制字符?

一个简单的正则表达式可以达到如下所示的效果:

.replaceAll("[\p{Cntrl}&&[^rnt]]", "");

还要确保您编码的字符也被JAVA正确处理。通常JAVA在处理反斜杠方面不是很好。因此,转义反斜杠.replace("\", "\\")

这就行了。

最新更新