[英]Problems with German Umlaute, TCPIP from SWI Prolog to JAVA
我嘗試在Prolog服務器應用程序和Java客戶端應用程序之間實現tcpip連接。 它有效,但我有問題,我沒有正確收到德國元音(ä,ü等)。 這就是我做的:
在Java中,客戶端:
inputreader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"UTF-8" ));
...
StringBuilder sb = new StringBuilder();
String responseLine;
while ((responseLine = inputreader.readLine()) != null) {
// System.out.println("Server: " + responseLine);
// Character.toString ((char) i);
sb.append(responseLine);
if( responseLine.indexOf( ".") != -1 && responseLine.length() == 1 ){
break;
}
}
在SWI Prolog中,服務器端:
:- set_prolog_flag(encoding,utf8).
% based on http://swi-prolog.996271.n3.nabble.com/socket-communication-td1653.html
server(PortNumber) :-
setup_call_cleanup(tcp_socket(S), % no leaks, please
(true; fail),
tcp_close_socket(S)),
tcp_bind(S, PortNumber),
tcp_listen(S, 5),
format('listen to portnumber ~w~n', [PortNumber]),
server_loop(S).
server_loop(S) :-
tcp_accept(S, S1, From),
format('receiving traffic from: ~q~n', [From]),
setup_call_cleanup(tcp_open_socket(S1, In, Out),
server_operation(In, Out),
( writeln('closing...'),
close(In),
close(Out))), !,
server_loop(S).
server_operation(In, Out) :-
\+at_end_of_stream(In),
read_pending_input(In, Codes, []),
atom_codes(Text,Codes),
write('received from client: '),write(Text),nl,
% job which has to be done in Prolog
extract_fct_call( Text, Fname, ListOfIname, ListOfIcontent ),
call_fct( Fname, ListOfIname, ListOfIcontent, XMLreply ),
atom_codes( XMLreply, CodeReply ),
% append defined EOM as \n.\n
append( CodeReply, [10,46,10], CodeMessage ),
format(Out, '~s', [Message]),
flush_output(Out),
server_operation(In, Out).
server_operation(_In, _Out).
所以,我認為定義雙方UTF-8編碼會做到這一點,但事實並非如此。 我從“Gemüse”開始SWI Prolog方面,並在Java方面獲得“Gemxse”。 我嘗試使用發送ASCII代碼
atom_codes( Message, CodeMessage ),
format(Out, '~s', [CodeMessage]),
在Java方面
inputreader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"US-ASCII" ));
要么
inputreader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"ASCII" ));
但結果不會改變。 我能做什么?
提前謝謝了!
解:
在CapelliC的幫助下,它通過添加來解決
set_stream(流,編碼(utf8))
至
server_operation(In, Out) :-
set_stream(In, encoding(utf8)),
set_stream(Out, encoding(utf8)),
\+at_end_of_stream(In),
...
然后在Java應用程序中接收Umlaute(確保在項目的屬性中,文本的編碼也設置為UTF-8)。
stream_property (Stream,encoding(Encoding))將允許您檢查和更改Prolog端的編碼。 但是一旦你確認Prolog實際上默認為UTF-8,並且你對此感到滿意,也許你應該調整Java接口,也許在每個IO操作上指定編碼
byte[] utf8Bytes = s.getBytes("UTF-8");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.