簡體   English   中英

德國Umlaute的問題,從SWI Prolog到JAVA的TCPIP

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM