2012-06-22 4 views
0

JSON 피드의 특수 문자 (브라우저에서 볼 때 완벽하게 표시됨)가 안드로이드 코드에서 사용되는 이유는 무엇인지 알아 내려고합니다. 악센트 부호, 줄임표 문자, 중괄호 문자 등이있는 문자는 다른 문자로 대체됩니다. 아마도 UTF-8에서 ASCII로 변환 할 수 있습니까? 나는 잘 모르겠다. GET 요청을 사용하여 JSON 데이터를 서버에서 가져 와서 파싱하고 데이터베이스에 저장 한 다음 Html.fromHtml()을 사용하여 TextView에 내용을 저장합니다.HTTP GET 응답의 이상한 문자

답변

1

많은 실험을 거친 후 문제가 Ignition HTTP 라이브러리 (https://github.com/kaeppler/ignition)에 있음을 발견 할 때까지 가능한 범위를 좁혔습니다. 특히, ignitedHttpResponse.getResponseBodyAsString()으로

편리한 단축키이지만 그 한 줄은 깨진 문자가됩니다. 대신에, 지금 사용

InputStream contentStream = ignitedHttpResponse.getResponseBody(); 
String content = Util.inputStreamToString(contentStream); 


public static String inputStreamToString(InputStream is) throws IOException { 
     String line = ""; 
     StringBuilder total = new StringBuilder(); 

     // Wrap a BufferedReader around the InputStream 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 

     // Read response until the end 
     while ((line = rd.readLine()) != null) { 
      total.append(line); 
     } 

     // Return full string 
     return total.toString(); 
    } 

편집 : 여기에서 자세한 내용

추가 문제를 재현하기위한 최소한의 테스트 케이스이다. 로그에서

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.test); 

    activity = this; 

    instance = this; 

    String url = SaveConstants.URL; 
    IgnitedHttpRequest request = new IgnitedHttp(activity).get(url); 
    InputStream contentStream = null; 
    try { 
    IgnitedHttpResponse response = request.send(); 

    String badContent = response.getResponseBodyAsString(); 
    int start = badContent.indexOf("is Texas"); 
    Log.e(TAG, "bad content: " + badContent.substring(start, start + 10)); 
    contentStream = response.getResponseBody(); 
    String goodContent = Util.inputStreamToString(contentStream); 
    start = goodContent.indexOf("is Texas"); 
    Log.e(TAG, "good content: " + goodContent.substring(start, start + 10)); 
    } catch (IOException ioe) { 
     Log.e(TAG, "error", ioe); 
    } 
} 

:

나쁜 내용 : Texasâ 좋은 내용이다 : 텍사스 '

업데이트입니다 : 중 내가 미쳤다고, 또는에서만 문제가 발생 콘텐츠가 브라우저에서 볼 때 동일하게 보일지라도 개발 피드가 아닌 고객의 제작 피드 - "텍사스"를 보여줍니다. 그래서 아마도이 문제를 일으키는 몇 가지 서버 구성이 필요할 수 있습니다 ...하지만 여전히 발생합니다. 문제가 발생했을 때 해결 방법은 제가 설명한대로입니다. response.getResponseBodyAsString();을 사용하지 않는 것이 좋습니다.

+0

점화는 Apache의 'EntityUtils'를 사용하여 해당 문자열을 생성합니다. 문서에서 : "엔터티의 내용을 읽고이를 문자열로 반환합니다. 내용이 엔터티 (있는 경우)에서 문자 집합을 사용하여 변환되면"ISO-8859-1 "이 사용됩니다." 서버가 잘못된 인코딩으로 응답하는지 확인하십시오. – Matthias

+0

여전히 잘못되었다고 생각하면 Apache Commons HttpComponents에 버그를 신고하십시오. – Matthias

+0

나는 점화를 많이 사용했다 (심지어 droidfu도). json 데이터 구조 내에서 html을 보내는 것은 보통 꽤 잘 보존되고 처음부터 사용할 수 있습니다 (추가 인코딩을 보완 할 필요가 없습니다). Matthias가 말한 것처럼 서버 인코딩을 확인하고 더 나은 결과를 도울 수있는 몇 가지 예를 제공해 줄 수 있습니다. @Matthias, yer 내 영웅 형제. 나는 네가 누구 이건, 네가 잘하고 있기를 바란다. – petey