2012-01-16 96 views
4

Java節點接收以UTF-8編碼的Erlang字符串。它的類類型是OtpErlangString。如果我簡單地執行.toString().stringValue(),則生成的java.lang.String具有無效的代碼點(基本上Erlang字符串中的每個字節都被視爲不同的字符)。將Erlang UTF-8編碼的字符串轉換爲java.lang.String

現在,我想在創建Java字符串時使用new String(bytes, "UTF-8"),但如何從OtpErlangString獲取字節?

+0

是否java.io.StringReader中的幫助嗎? – Reddy 2012-01-16 10:54:09

+0

我不明白。你能提出一種使用它的方法嗎? – 2012-01-16 11:02:21

+0

我的錯誤,我認爲OtpErlangString擴展字符串。 – Reddy 2012-01-16 11:21:21

回答

1

當你使用UTF8字符時,你很容易在Java端獲得OtpErlangString。如果我只使用ASCII字符,我會得到這種類型的對象。如果我至少添加一個UTF8字符,則生成的類型是OtpErlangList(這是邏輯的,因爲字符串只是Erlang中的整數列表),然後我可以使用它的stringValue()方法。所以,像發送字符串形式二郎後:

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

在Java的節點我接收和打印:

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

輸出是正確的:

ąćśźżęółńa 

但是,如果它不在你的情況下,你可以嘗試通過例如強制OtpErlangList表示來解決這個問題添加一個空的元組的字符串列表的第一個元素:

([email protected])11> {proc, [email protected]} ! [{}] ++ "ąćśźżęółń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()); 
+0

發送「да」(俄語爲「yes」)的[208,180,208,176]會產生一個「OtpErlangString」。要在列表前加入一個空元組來強制創建'OtpErlangList'對象是很好的,但是沒有更簡單的解決方案嗎?沒有辦法從'OtpErlangString'對象中提取二進制數組嗎? – 2012-01-19 12:21:22