JSON 피드의 특수 문자 (브라우저에서 볼 때 완벽하게 표시됨)가 안드로이드 코드에서 사용되는 이유는 무엇인지 알아 내려고합니다. 악센트 부호, 줄임표 문자, 중괄호 문자 등이있는 문자는 다른 문자로 대체됩니다. 아마도 UTF-8에서 ASCII로 변환 할 수 있습니까? 나는 잘 모르겠다. GET 요청을 사용하여 JSON 데이터를 서버에서 가져 와서 파싱하고 데이터베이스에 저장 한 다음 Html.fromHtml()을 사용하여 TextView에 내용을 저장합니다.HTTP GET 응답의 이상한 문자
0
A
답변
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();을 사용하지 않는 것이 좋습니다.
관련 문제
- 1. 소켓을 사용하는 HTTP 응답의 임의 문자
- 2. 응답의 http 헤더보기
- 3. 안드로이드 GET HTTP PHP는 유니 코드 문자
- 4. XML 응답의 이상한 문자 Google 날씨 API 오류
- 5. HTTP 응답의 XML
- 6. 서버에서받은 XML 응답의 특수 문자
- 7. http GET Limit (iPhone)
- 8. Ajax 응답의 http 헤더가 누락되었습니다.
- 9. HTTP GET
- 10. URL 변수 (GET)와 함께 나타나는 아포스트로피가 아닌 이상한 문자
- 11. 이상한 GET 요청 업로드
- 12. • .get 응답에 ¿ 문자 인코딩 문제
- 13. GZIPOutputStream이 HTTP 응답의 문자열을 올바르게 압축하지 않습니다.
- 14. 이상한 문자
- 15. 이상한 문자
- 16. 웹 수확 이상한 문자
- 17. Android webservice GET 요청은 XML 응답의 일부만을 응답합니다.
- 18. JSON에서 최대 HTTP GET 메서드
- 19. HTTP GET 요청 URL에 어떤 문자 인코딩이 사용됩니까?
- 20. base64_decode 추가 이상한 문자
- 21. json 출력에서 이상한 $ 문자
- 22. 이상한 sifr 문자 문제
- 23. 이상한 http gzip 문제
- 24. Node.js를 HTTP GET
- 25. GET HTTP 요청
- 26. Android - HTTP GET Request
- 27. WordNet 및 HTTP GET
- 28. Android HTTP get methods
- 29. UnknownHostException (webservice http-get)
- 30. HTTP GET bash는
점화는 Apache의 'EntityUtils'를 사용하여 해당 문자열을 생성합니다. 문서에서 : "엔터티의 내용을 읽고이를 문자열로 반환합니다. 내용이 엔터티 (있는 경우)에서 문자 집합을 사용하여 변환되면"ISO-8859-1 "이 사용됩니다." 서버가 잘못된 인코딩으로 응답하는지 확인하십시오. – Matthias
여전히 잘못되었다고 생각하면 Apache Commons HttpComponents에 버그를 신고하십시오. – Matthias
나는 점화를 많이 사용했다 (심지어 droidfu도). json 데이터 구조 내에서 html을 보내는 것은 보통 꽤 잘 보존되고 처음부터 사용할 수 있습니다 (추가 인코딩을 보완 할 필요가 없습니다). Matthias가 말한 것처럼 서버 인코딩을 확인하고 더 나은 결과를 도울 수있는 몇 가지 예를 제공해 줄 수 있습니다. @Matthias, yer 내 영웅 형제. 나는 네가 누구 이건, 네가 잘하고 있기를 바란다. – petey