4

Java 节点接收以 UTF-8 编码的 Erlang 字符串。它的类类型是OtpErlangString. 如果我只是这样做.toString().stringValue()结果java.lang.String有无效的代码点(基本上来自 Erlang 字符串的每个字节都被认为是不同的字符)。

现在,我想new String(bytes, "UTF-8")在创建 Java 字符串时使用,但如何从OtpErlangString?

4

1 回答 1

1

当您使用 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());
于 2012-01-19T07:51:23.370 回答