当你在Java端使用UTF8字符时,得到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();
OtpErlangObject[] strArr = Arrays.copyOfRange(l.elements(), 1, l.elements().length);
OtpErlangList l2 = new OtpErlangList(strArr);
System.out.println(l2.stringValue());
encode()
用于将字符串转换为等效的 Erlang 外部表示形式。我认为我不应该将其用于此目的。 - Martin Dimitrov