从SWI Prolog到JAVA的德国Umlaute、TCPIP问题
我尝试在Prolog服务器应用程序和Java客户端应用程序之间实现tcpip连接。它可以工作,但我有一个问题,我没有收到正确的德国Umlaute(ä,ü等)。我就是这么做的:
在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编码可以做到这一点,但事实并非如此。我从SWI Prolog端开始,使用“Gemüse”,在Java端接收“Gemxse”。我试图通过使用
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" ));
但结果并没有改变。 我能做什么
非常感谢
解决方案:
在Capelical的帮助下,通过添加
设置_流(流,编码(utf8))
到
server_operation(In, Out) :-
set_stream(In, encoding(utf8)),
set_stream(Out, encoding(utf8)),
\+at_end_of_stream(In),
...
然后在Java应用程序中接收Umlaute(确保在项目的属性中,文本编码也设置为UTF-8)
# 1 楼答案
stream_property(Stream,encoding(encoding))将允许您在Prolog端检查和更改编码。但是,一旦您验证了Prolog实际上默认为UTF-8,并且对此感到满意,那么您可能应该调整Java接口,或者在每个IO操作上指定编码