简体   繁体   English

将Erlang UTF-8编码的字符串转换为java.lang.String

[英]Convert Erlang UTF-8 encoded string to java.lang.String

The Java node receives an Erlang string encoded in UTF-8. Java节点接收以UTF-8编码的Erlang字符串。 Its class type is OtpErlangString . 它的类类型是OtpErlangString If I simply do .toString() or .stringValue() the resulting java.lang.String has invalid codepoints (basically every byte from the Erlang string is considered distinct character). 如果我只是执行.toString().stringValue()则生成的java.lang.String具有无效的代码点(基本上,Erlang字符串中的每个字节都被视为不同的字符)。

Now, I want to use new String(bytes, "UTF-8") when creating the Java String but how to get the bytes from the OtpErlangString ? 现在,我想在创建Java String时使用new String(bytes, "UTF-8") ,但是如何从OtpErlangString获取字节?

It's strange you get OtpErlangString on Java side when you use UTF8 characters. 当您使用UTF8字符时,在Java端获得OtpErlangString是很奇怪的。 I get object of this type if I use ASCII characters only. 如果我只使用ASCII字符,我会得到这种类型的对象。 If I add at least one UTF8 character, the resulting type is OtpErlangList (which is logical as strings are just lists of ints in Erlang) and then I can use its stringValue() method. 如果我添加至少一个UTF8字符,结果类型是OtpErlangList(这是逻辑的,因为字符串只是Erlang中的int列表)然后我可以使用它的stringValue()方法。 So that after sending string form Erlang like: 这样在发送字符串形式之后Erlang就像:

(waco@host)8> {proc, java1@host} ! "ąćśźżęółńa".
[261,263,347,378,380,281,243,322,324,97]

On Java node I receive and print it with: 在Java节点上,我收到并打印它:

OtpErlangList l = (OtpErlangList) mbox.receive();
System.out.println(l.stringValue());

The output is correct: 输出是正确的:

ąćśźżęółńa

However, if its not the case in your situation, you could try to work it around by forcing OtpErlangList representation by eg adding an empty tuple as the very first element of the string list: 但是,如果情况并非如此,您可以尝试通过强制使用OtpErlangList表示来处理它,例如添加一个空元组作为字符串列表的第一个元素:

(waco@wborowiec)11> {proc, java1@wborowiec} ! [{}] ++ "ąćśźżęółńa".
[{},261,263,347,378,380,281,243,322,324,97]

And on Java side something like: 在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());

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM