Иностранные символы в Android и Java
Я пытался загрузить и проанализировать веб-страницу с иностранными (китайскими) символами. Я не уверен, должен ли я использовать "utf-8" или что-то еще. Но ни один из них, кажется, не работает для меня. Я использовал пример кода Wikitionary для getUrlContent()
,
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mText = (TextView) findViewById(R.id.textview1);
huaren.prepareUserAgent(this);
String test = new String("fail");
try {
test = getUrlContent("http://huaren.us/");
} catch (ApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] b = new byte[100000];
try {
b = test.getBytes("utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
char[] charArr = (new String(b)).toCharArray();
CharSequence seq = java.nio.CharBuffer.wrap(charArr);
mText.setText(charArr, 0, 1000);//.setText(seq);
}
protected static synchronized String getUrlContent(String url) throws ApiException {
if (sUserAgent == null) {
throw new ApiException("User-Agent string must be prepared");
}
// Create client and set our specific user-agent string
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
request.setHeader("User-Agent", sUserAgent);
try {
HttpResponse response = client.execute(request);
// Check if server response is valid
StatusLine status = response.getStatusLine();
if (status.getStatusCode() != HTTP_STATUS_OK) {
throw new ApiException("Invalid response from server: " +
status.toString());
}
// Pull content stream from response
HttpEntity entity = response.getEntity();
InputStream inputStream = entity.getContent();
ByteArrayOutputStream content = new ByteArrayOutputStream();
// Read response into a buffered stream
int readBytes = 0;
while ((readBytes = inputStream.read(sBuffer)) != -1) {
content.write(sBuffer, 0, readBytes);
}
// Return result from buffered stream
return new String(content.toByteArray(), "utf-8");
} catch (IOException e) {
throw new ApiException("Problem communicating with API", e);
}
}
2 ответа
Кодировка определяется на самой странице:
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
В общем, существует 3 способа указать кодировку HTML-страницы HTTP-сервера:
Content-Type заголовок HTTP
Content-Type: text/html; charset=utf-8
Кодировка псевдоатрибута в декларации XML
<?xml version="1.0" encoding="utf-8" ?>
метатег внутри головы
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
см. Кодировки символов для деталей
Поэтому вы должны попытаться оценить каждое возможное объявление, чтобы найти подходящую кодировку. Вы можете попытаться проанализировать страницу с помощью utf-8 и перезапустить ее, если встретите метатег объявления Content-Type.
Попробуйте библиотеку GuessEncoding. Это не 100% пуленепробиваемое, но может помочь много раз.