Java 节点接收以 UTF-8 编码的 Erlang 字符串。它的类类型是OtpErlangString
. 如果我只是这样做.toString()
或.stringValue()
结果java.lang.String
有无效的代码点(基本上来自 Erlang 字符串的每个字节都被认为是不同的字符)。
现在,我想new String(bytes, "UTF-8")
在创建 Java 字符串时使用,但如何从OtpErlangString
?
Java 节点接收以 UTF-8 编码的 Erlang 字符串。它的类类型是OtpErlangString
. 如果我只是这样做.toString()
或.stringValue()
结果java.lang.String
有无效的代码点(基本上来自 Erlang 字符串的每个字节都被认为是不同的字符)。
现在,我想new String(bytes, "UTF-8")
在创建 Java 字符串时使用,但如何从OtpErlangString
?
当您使用 UTF8 字符时,您在 Java 端得到 OtpErlangString 很奇怪。如果我只使用 ASCII 字符,我会得到这种类型的对象。如果我添加至少一个 UTF8 字符,则结果类型是 OtpErlangList(这是合乎逻辑的,因为字符串只是 Erlang 中的整数列表),然后我可以使用它的 stringValue() 方法。这样在发送 Erlang 形式的字符串后,如下所示:
(waco@host)8> {proc, java1@host} ! "ąćśźżęółńa".
[261,263,347,378,380,281,243,322,324,97]
在 Java 节点上,我接收并打印它:
OtpErlangList l = (OtpErlangList) mbox.receive();
System.out.println(l.stringValue());
输出是正确的:
ąćśźżęółńa
但是,如果您的情况并非如此,您可以尝试通过强制 OtpErlangList 表示来解决它,例如添加一个空元组作为字符串列表的第一个元素:
(waco@wborowiec)11> {proc, java1@wborowiec} ! [{}] ++ "ąćśźżęółńa".
[{},261,263,347,378,380,281,243,322,324,97]
在Java方面,例如:
OtpErlangList l = (OtpErlangList) mbox.receive();
// get rid of an extra tuple
OtpErlangObject[] strArr = Arrays.copyOfRange(l.elements(), 1, l.elements().length);
OtpErlangList l2 = new OtpErlangList(strArr);
System.out.println(l2.stringValue());