2011-08-28 7 views
3

올바른 해결책을 찾을 수없는 인코딩 문제가 있습니다.C# TCP 서버와 Java TCP 클라이언트 간의 인코딩 문제

XML을 수신하고 응답하는 창 서비스로 실행되는 C# TCP 서버가 있는데, 스페인어 문자 (예 : á, é, í 및 기타)가있는 특수 문자를 출력 할 때 문제가 발생합니다.

서버 응답이 UTF-8로 인코딩되고 Java 클라이언트가 UTF-8을 사용하여 읽는 중입니다. 그러나 출력물을 출력 할 때 문자는 완전히 다릅니다.

이 문제는 Java 클라이언트에서만 발생합니다 (C# TCP 클라이언트는 예상대로 작동 함).

는 다음을 보여줍니다 서버 코드의 조각이다 인코딩 문제 :이 간단한 테스트를 들면

socket.connect(new InetSocketAddress(param.getServerIp(), param.getPort()), 20000); 
InputStream sockInp = socket.getInputStream(); 
InputStreamReader streamReader = new InputStreamReader(sockInp, Charset.forName("UTF-8")); 
sockReader = new BufferedReader(streamReader); 
String tmp = null; 
while((tmp = sockReader.readLine()) != null){ 
    System.out.println(tmp); 
} 

, 출력 쇼는 다음과 같습니다 :

byte[] destBytes = System.Text.Encoding.UTF8.GetBytes("á"); 
    try 
    { 
     clientStream.Write(destBytes, 0, destBytes.Length); 
     clientStream.Flush(); 
    }catch (Exception ex) 
    { 
     LogErrorMessage("Error en SendResponseToClient: Detalle::", ex); 
    } 

자바 클라이언트가 C#을 서버

ß 

각 언어의 [] 바이트를 인쇄하는 일부 테스트를 수행했습니다. 및 C# A를 출력하는 동안에 같이 자바 바이트 195, 161

는 []로 인쇄 읽어

이 서명 된 (자바)으로해야 할 것 -61, -95, 부호 (C 번호)?

모든 의견을 크게 환영합니다. 일반적으로 BOM을 포함하여 해결 될 것

이 ... http://de.wikipedia.org/wiki/Byte_Order_Mark을 볼 날이으로

+0

하지 대답하지만, 데이터 포인트 어쨌든 - 당신이 의도 한대로 파이썬은 C# 버전을 디코딩을 수행합니다. '인쇄' '.join (x의 CHR (X)를에 [195, 161]) 디코딩 ('utf-8') -> '. 해당 순서를 보존하려고하면 java의 utf-8이 유효한 utf-8이 아닌 것 같습니다. – viraptor

+0

감사합니다. 아직 실험 중입니다. (운 없음 지금까지). – jcgarciam

+0

나는 abbers 예제에서 실수를했다. (이미 편집 중이다.) java byte []에서 -61, -95로 인쇄한다. 유효한 UTF8 문자입니다. 문제는 OS (창) 자체에있는 것처럼 보입니다. 잘못된 문자를 출력하는 이상한 설정이 무엇인지 모르겠습니다. – jcgarciam

답변

1

은 ... 당신이 문자열을 인쇄하기 전에 자바 바이트를 반대로하여 확인 할 수 있습니다 ... 엔디안 문제처럼 보인다

+0

utf-8이면 BOM이 필요하지 않으므로 아무 것도 변경하지 않습니다. utf-8 인코딩은 리틀 및 빅 엔디 언 머신에서 항상 동일한 표현을 사용합니다. (http://unicode.org/faq/utf_bom.html#bom5) – viraptor

+0

Endian과 C# 및 Java에 대해 읽은 후 동일한 인상을 받고 있습니다. – jcgarciam

+0

나는 문제가 서버가 실행 중이고, 인쇄해야하는 간단한 자바 프로그램을 만들고 거기에 실행하는 것이 이상한 문자를 인쇄하는 것일 수 있다고 생각하지만, 다른 OS (리눅스)에서는 예상대로 올바르게 인쇄한다. 캐릭터. 그래서 나는 방금 끝과 끝에서 소켓과 인코딩을 버렸다. – jcgarciam

0

UTF-8 데이터로 바이트를 인코딩하려고 시도하는 유니 코드 문자가 확실하지 않습니까?

아래에 문자열을 전송하기 전에 해당 문자열의 데이터가 ccorrect UTF-8인지 테스트 할 수있는 유용한 방법이 있습니다.

How to test an application for correct encoding (e.g. UTF-8)

+0

귀하의 진술을 이해하지 못합니다. 위의 예제에서 UTF-8 바이트 [] 인코딩을 테스트하는 인스턴트 메신저. – jcgarciam