Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.237.15.145] |
|
Сообщ.
#1
,
|
|
|
Есть xml. Его парсю через андройд апликэйшн. Всё получается, если английский язык. Но если поменять в xml - на русский язык, то при отображении страницы в android api - символы отображаются некорректно. Испробовал поменять кодировку в xml с utf-8 на windows-1251. Не помогло. Пробовал заставить апликацию понимать кодировку -
InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); is.setEncoding ("windows-1251"); doc = db.parse(is); Ничего не выходит. Может, кто сможет подсказать. Если надо больше исходника - выложу... is.setEncoding("UTF_8"); тоже ничего не выходит Посмотрел в вики http://ru.wikipedia.org/wiki/%D0%9A%D1%80%...%B1%D1%80%D1%8B Сравнил крокозябры. Если мы ставим в xml, который парсим, кодировку 1251, то крокозябры как будто идёт перекодировка из 1251 в 1252. Если мы ставим в xml кодировку utf-8, то крокозябры выглядят, как будто перекодируем из utf в 1252. В чём может быть проблема? |
Сообщ.
#2
,
|
|
|
А в эксемельке в первой строке есть encoding="UTF-8" ?
|
Сообщ.
#3
,
|
|
|
конечно(
Такое ощущение, что на выходе в win1252 каким-то образом перекодирует...(но это только ощущения) |
Сообщ.
#4
,
|
|
|
muskos, сейчас нет компа по рукой, завтра гляну.
|
Сообщ.
#5
,
|
|
|
Британский учёныйЗавтра я с ума сойду с этой кодировкой....
|
Сообщ.
#6
,
|
|
|
Так спроси на стековерфло, там мигом ответят.
|
Сообщ.
#7
,
|
|
|
ну, языка не хватает)
спросил на hashcode - молчат((( |
Сообщ.
#8
,
|
|
|
Британский учёный стековерфло молчит, Хэшкод молчит...
|
Сообщ.
#9
,
|
|
|
Сообщ.
#10
,
|
|
|
Британский учёный Вообщем...мне кажется проблема не на входе, а на выходе...
Когда я смотрю в вики сравнение на кракозябры почему-то кодировку xml он принимает как надо - utf-8(или когда я менял - windows-1251)...но на выходе получается кракозябры как будто идёт перекодировка в windows-1252... Проверяю не только в эмуляторе, но и в телефоне. Версия android - 2.2. Сегодня попробовал скопипастить другой пример парсинга. Опять же английский парсит, на русский выводит перекодировку в windows-1252 Добавлено Британский учёный Понимаете, в чём дело) Я не особо крут в ява))) принцип понимаю, но что куда - не особо) У меня слегка другой код))) Ща... Добавлено import javax.xml.parsers.ParserConfigurationException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public class XMLParser { public final static Document XMLfromString(String xml){ Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); } catch (ParserConfigurationException e) { System.out.println("XML parse error: " + e.getMessage()); return null; } catch (SAXException e) { System.out.println("Wrong XML file structure: " + e.getMessage()); return null; } catch (IOException e) { System.out.println("I/O exeption: " + e.getMessage()); return null; } return doc; } /** Returns element value * @param elem element (it is XML tag) * @return Element value otherwise empty String */ public final static String getElementValue( Node elem ) { Node kid; if( elem != null){ if (elem.hasChildNodes()){ for( kid = elem.getFirstChild(); kid != null; kid = kid.getNextSibling() ){ if( kid.getNodeType() == Node.TEXT_NODE ){ return kid.getNodeValue(); } } } } return ""; } public static String getXML(){ String line = null; try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost("http://alfoot.net/newfile.xml"); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); line = EntityUtils.toString(httpEntity); } catch (UnsupportedEncodingException e) { line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; } catch (MalformedURLException e) { line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; } catch (IOException e) { line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; } return line; } public static int numResults(Document doc){ Node results = doc.getDocumentElement(); int res = -1; try{ res = Integer.valueOf(results.getAttributes().getNamedItem("count").getNodeValue()); }catch(Exception e ){ res = -1; } return res; } public static String getValue(Element item, String str) { NodeList n = item.getElementsByTagName(str); return XMLParser.getElementValue(n.item(0)); } } package blr.first; import java.util.ArrayList; import java.util.HashMap; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import android.app.ListActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class PrimierMatchActivity extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listplaceholder); ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); String xml = XMLParser.getXML(); Document doc = XMLParser.XMLfromString(xml); int numResults = XMLParser.numResults(doc); if((numResults <= 0)){ Toast.makeText(PrimierMatchActivity.this, "Geen resultaten gevonden", Toast.LENGTH_LONG).show(); finish(); } NodeList nodes = doc.getElementsByTagName("result"); for (int i = 0; i < nodes.getLength(); i++) { HashMap<String, String> map = new HashMap<String, String>(); Element e = (Element)nodes.item(i); map.put("id", XMLParser.getValue(e, "id")); map.put("name", "Naam:" + XMLParser.getValue(e, "name")); map.put("Score", "Score: " + XMLParser.getValue(e, "score")); mylist.add(map); } ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.primiermatch, new String[] { "name", "Score" }, new int[] { R.id.item_title, R.id.item_subtitle }); setListAdapter(adapter); final ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { @SuppressWarnings("unchecked") HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position); Toast.makeText(PrimierMatchActivity.this, "ID '" + o.get("id") + "' was clicked.", Toast.LENGTH_LONG).show(); } }); } } вот два моих файлика...если можно, покажите куда копипастить)) Добавлено Кажется нашёл, но всё же, пока тестю, если сможите - отпишите) может не то нашёл) |
Сообщ.
#11
,
|
|
|
muskos, тести бо я у компа буду часа через 2
|
Сообщ.
#12
,
|
|
|
Цитата muskos @ public class XMLParser { public final static Document XMLfromString(String xml){ Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); } catch (ParserConfigurationException e) { System.out.println("XML parse error: " + e.getMessage()); return null; } catch (SAXException e) { System.out.println("Wrong XML file structure: " + e.getMessage()); return null; } catch (IOException e) { System.out.println("I/O exeption: " + e.getMessage()); return null; } return doc; } Вот это не надо делать, достаточно воспользоваться методом public Document parse(String uri) |
Сообщ.
#13
,
|
|
|
mrco Эм...я ноль))) Ну, спасибо, почитаю, может просветит)
|
Сообщ.
#14
,
|
|
|
Не, я ошибся. Это сосвем не то что нужно.
|
Сообщ.
#15
,
|
|
|
хух)) расслабил)
на стековерфло всё пытаются на шрифт давить и кодировку....думаю проблема не в этом.. |
Сообщ.
#16
,
|
|
|
В общем-то:
InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); должно работать. без каких либо указаний кодировок, потому что на входе у вас String. А он бывает только в одной кодировке. 1. Проверьте что у вас в строке на входе в метод XMLfromString, если она битая, то дальше ничего уже не исправить. 2. У вас Response от сервера сначала перегоняеться в строку, а потом из строки в xml документ. Это лишние действия: final HttpResponse response = mHttpClient.execute(request); final InputStream in = response.getEntity().getContent(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); // never forget this! DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(in); этот фрагмент гарантированно работает с UTf-8. |
Сообщ.
#17
,
|
|
|
Британский учёный
public class XMLParser { public final static Document XMLfromString(String xml){ Document doc = null; //DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //DocumentBuilder builder = dbf.newDocumentBuilder(); try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); DocumentBuilder db = dbf.newDocumentBuilder(); //StringReader sr = new StringReader(xml); //InputSource is = new InputSource(sr); //is.setCharacterStream(new StringReader(xml)); //is.setEncoding("utf-8"); ByteArrayInputStream encXML = new ByteArrayInputStream(xml.getBytes("UTF8")); doc = builder.parse(encXML); } catch (ParserConfigurationException e) { System.out.println("XML parse error: " + e.getMessage()); return null; } catch (SAXException e) { System.out.println("Wrong XML file structure: " + e.getMessage()); return null; } catch (IOException e) { System.out.println("I/O exeption: " + e.getMessage()); return null; } return doc; } методом тыка испробовал много вариантов...всё равно кодировку не меняет( Добавлено mrco знаний не хватает - проверить что в строке на входе((( Добавлено mrco Я слегка не понимаю про Response... У меня всё тоже самое, кроме одной строчки, только раскидано между функциями... public class XMLParser { public final static Document XMLfromString(String xml){ Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); // never forget this! try { DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); } catch (ParserConfigurationException e) { System.out.println("XML parse error: " + e.getMessage()); return null; } catch (SAXException e) { System.out.println("Wrong XML file structure: " + e.getMessage()); return null; } catch (IOException e) { System.out.println("I/O exeption: " + e.getMessage()); return null; } return doc; } /** Returns element value * @param elem element (it is XML tag) * @return Element value otherwise empty String */ public final static String getElementValue( Node elem ) { Node kid; if( elem != null){ if (elem.hasChildNodes()){ for( kid = elem.getFirstChild(); kid != null; kid = kid.getNextSibling() ){ if( kid.getNodeType() == Node.TEXT_NODE ){ return kid.getNodeValue(); } } } } return ""; } public static String getXML(){ String line = null; try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost("http://alfoot.net/newfile.xml"); HttpResponse httpResponse = httpClient.execute(httpPost); InputStream in = httpResponse.getEntity().getContent();// HttpEntity httpEntity = httpResponse.getEntity(); line = EntityUtils.toString(httpEntity); } catch (UnsupportedEncodingException e) { line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; } catch (MalformedURLException e) { line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; } catch (IOException e) { line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; } return line; } // final HttpResponse response = mHttpClient.execute(request); // final InputStream in = response.getEntity().getContent(); public static int numResults(Document doc){ Node results = doc.getDocumentElement(); int res = -1; try{ res = Integer.valueOf(results.getAttributes().getNamedItem("count").getNodeValue()); }catch(Exception e ){ res = -1; } return res; } public static String getValue(Element item, String str) { NodeList n = item.getElementsByTagName(str); return XMLParser.getElementValue(n.item(0)); } } |
Сообщ.
#18
,
|
|
|
Самое обидное...то, что уже столько получилось копипастом...и на одной фишке легло(((
Добавлено Это переменная doc 03-28 13:58:07.523: I/System.out(305): !: org.apache.harmony.xml.dom.DocumentImpl@44f69f88 Переменная line в месте где должны быть наши буковки русские...уже хранит абракадабру - 03-28 13:59:44.493: I/System.out(333): <name>Ðоманда Ð - Ðоманда Ð</name> mrco, вы имели в виду этот вход? Или есть ещё где? |
Сообщ.
#19
,
|
|
|
Цитата muskos @ Переменная line в месте где должны быть наши буковки русские...уже хранит абракадабру - Тоесть ПЕРЕД парсингом уже фигня в строке? Тогда парсер не причёмю |
Сообщ.
#20
,
|
|
|
На всякий случай покажу, где переменная line лежит...и в какой момент она что делает...
public static String getXML(){ String line = null; try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost("http://alfoot.net/newfile.xml"); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); line = EntityUtils.toString(httpEntity); } catch (UnsupportedEncodingException e) { line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; } catch (MalformedURLException e) { line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; } catch (IOException e) { line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; } return line; } Хорошо, тогда ЧТО ЖЕ ЭТО МОЖЕТ БЫТЬ((( У МЕНЯ УЖЕ ГОЛОВА КРУГОМ)))) |
Сообщ.
#21
,
|
|
|
С сервера xml приходит в какой кодировке?
Если utf-8 то попробуйте line = EntityUtils.toString(httpEntity, "UTF-8"); |
Сообщ.
#22
,
|
|
|
mrco Я ПРОСТО В ШОКЕ!!!!!!!!!! СПАСИБО БОЛЬШОЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|