2014-06-20 2 views
0

웹 페이지 응답에서 다른 유형의 인코딩을 읽을 수있는 프로그램을 작성하려고합니다. 지금은 AMF 데이터의 응답을 성공적으로 읽는 방법을 알아 내려고 노력하고 있습니다. 그것을 보내는 것은 문제가되지 않으며, HttpWrapper를 사용하여 응답 문자열을 얻습니다. 그러나 많은 문자가 번역에서 손실됩니다. 그 목적을 위해, 나는 바이트로 응답을 받고, 다음 읽을 텍스트로 변환하려고합니다.웹 페이지 응답 (amf)에서 바이트를 읽는 데 문제가 있습니다.

내가 얻는 중요한 사실은 문자가 번역에서 문자 그대로 손실된다는 것입니다. 저는 Charles 3.8.3 프로그램을 사용하여 16 진수와 AMF 위주로 응답해야하는 내용을 알 수있었습니다. 일반적으로 정상적인 문자는 괜찮지 만 비 유니 코드 문자가 표시 될 때마다 항상 "ef bf bd"가 표시됩니다. 다음과 같이 HTTP 응답을 읽어 내 코드는 다음과 같습니다

BufferedReader d = new BufferedReader(new InputStreamReader(new DataInputStream(conn.getInputStream()))); 
while (d.read() != -1) { 
String bytes = new String(d.readLine().getBytes(), "UTF-8"); 
    result += bytes; 
} 

다음과 같이 그때, 진수로 변환하려고 :

for (int x = 0; x < result.length(); x++) { 
    byte b = (byte) result.charAt(x); 
    System.out.print(String.format("%02x", b & 0xFF)); 
} 

내 출력이된다 0000000001000b2f312f6f6e526573756c7400046e756c6c00000 ** BF ** 찰스 반면 3.8.3은 다음과 같습니다. 0000000001000b2f312f6f6e526573756c7400046e756c6c00000 ** 0b **

이 문제를 해결하는 방법에 대해 궁금한 점이 있으니 도움을 주시면 대단히 감사하겠습니다. 시간 내 주셔서 감사합니다.

답변

1

코드는 모든 스트림에서 UTF-8 인코딩을 사용한다고 가정합니다. 이것은 단순히 부정확합니다. content-type 응답 헤더 필드를 검사해야합니다.

+0

응답 헤더는 "application/x-amf"입니다. 각 응답 유형을 읽는 특정 방법이 있다는 것을 몰랐습니다. 내가 어떻게 그럴 수 있니? 당신의 답변에 감사드립니다! @ Julian Reschke – Eurater

2

텍스트 작업을했기 때문에 readLine()을 사용하는 것 같습니다. Wikipedia에 따르면 AMF는 바이너리 인코딩이므로 encode/decode noop (ISO-8859-1이 필요하며 UTF-8이 필요하지 않습니다.)를 수행하지 않고 이와 같은 작업을 수행 할 수 있어야합니다. 작품).

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
byte[] buffer = new byte[2048]; 


try (InputStream in = conn.getInputStream()) { 
    int read; 
    while ((read = in.read(buffer)) >= 0) { 
     out.write(buffer, 0, read); 
    } 
} 

out.toByteArray(); 

// Convert to hex if you want. 
+0

이것은 내가 볼 수있는 것에서 훌륭하게 작동했습니다. 16 진수 문자열로 변환 한 후 Charles 3.8.3과 정확히 같은 16 진수 응답을 가지고 있음을 알 수 있습니다. 정말 고맙습니다 :) – Eurater

관련 문제