通过 TCP/IP 接收数据时 HL7V2 HAPI 解析器异常
HL7V2 HAPI parser exception while receiving data via TCP/IP
我正在使用版本为 2.3 的 HAPI hapi-structures-v25 库来解析 HL7v2 消息并将其转换为 FHIR 资源.我在通过 TCP 侦听器使用 HAPI 接收和解析 HL7V2 消息时遇到一个奇怪的问题。
Determine encoding for message. The following is the first 50 chars of the message for reference, although this may not be where the issue is: MSH|^~\&|test|DrJhonDoe|TEST|UNKNOWN|20210216190432||ADT^A01^ADT_A01|60b647d4-b5a5-4fae-a928-d4a3849de3c8|T|2.5
奇怪的是,当我尝试在 main 函数中将此消息作为字符串发送时,我没有收到此错误。只有当我通过 TCP/IP 接收到我的 Java 函数的数据时,我才会收到此错误。我尝试使用 Mirth 以及外部工具将 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 中明智地处理它。 How to remove control characters from java string?
一个简单的正则表达式就可以解决问题,如下所示:
.replaceAll("[\p{Cntrl}&&[^\r\n\t]]", "");
还要确保您编码的字符也能用 JAVA 正确处理。通常 JAVA 不擅长处理反斜杠。所以,转义反斜杠 .replace("\", "\\")
这样就可以了。
我正在使用版本为 2.3 的 HAPI hapi-structures-v25 库来解析 HL7v2 消息并将其转换为 FHIR 资源.我在通过 TCP 侦听器使用 HAPI 接收和解析 HL7V2 消息时遇到一个奇怪的问题。
Determine encoding for message. The following is the first 50 chars of the message for reference, although this may not be where the issue is: MSH|^~\&|test|DrJhonDoe|TEST|UNKNOWN|20210216190432||ADT^A01^ADT_A01|60b647d4-b5a5-4fae-a928-d4a3849de3c8|T|2.5
奇怪的是,当我尝试在 main 函数中将此消息作为字符串发送时,我没有收到此错误。只有当我通过 TCP/IP 接收到我的 Java 函数的数据时,我才会收到此错误。我尝试使用 Mirth 以及外部工具将 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 中明智地处理它。 How to remove control characters from java string?
一个简单的正则表达式就可以解决问题,如下所示:
.replaceAll("[\p{Cntrl}&&[^\r\n\t]]", "");
还要确保您编码的字符也能用 JAVA 正确处理。通常 JAVA 不擅长处理反斜杠。所以,转义反斜杠 .replace("\", "\\")
这样就可以了。