Vib*_*era 6 java string tcp mirth hapi
我正在使用2.3版的 HAPI hapi-structures-v25库来解析 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 函数时才会收到此错误。我尝试使用 Mirth 以及外部工具将 HL7 消息发送到我的接收 TCP 端口,结果相同。
这是我尝试处理的 HL7v2 消息示例
MSH|^~\\&|test|Dr.JhonDoe|TEST|UNKNOWN|20210216190432.7||ADT^A01^ADT_A01|60b647d4b5a54faea928d4a3849de3c8|T|2.5
EVN||20210216|20210216|
Run Code Online (Sandbox Code Playgroud)
从 tcp/ip 接收数据时,我使用 UTF-8 字符集将字节转换为字符串。
InputStream in = connection.getInputStream();
OutputStream out = connection.getOutputStream();
receivedMessageSize = in.read(receivedByeBuffer);
String incomingHl7Message = new String(receivedByeBuffer, StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)
我正确地收到了消息。但不确定为什么会出现错误。
正如Amit的回答中提到的,它需要在JAVA中转义。HL7v2 在通过 MLLP 传输时会将<VT>, <CR>Unicode 数据添加到文本中。这里需要理解的是,这些不是垃圾字符。根据MLLP协议,消息的开始和结束由这些unicode字符来标记,以描述帧的开始和结束。
HAPI HL7 解析无法解析这些特殊(不可打印)字符。很高兴我在同一个论坛上找到了一个解决方案来明智地用java处理它。如何从java字符串中删除控制字符?
一个简单的正则表达式就可以实现这一点,如下所示:
.replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", "");
Run Code Online (Sandbox Code Playgroud)
还要确保您编码的字符也能用 JAVA 正确处理。通常JAVA不擅长处理反斜杠。所以,逃避反斜杠.replace("\\", "\\\\")
这样就可以解决问题了。