2011-10-02 34 views
21

Tôi đang tải một số dữ liệu, chứa ký tự latin1, trong một WebView sử dụngEncoding vấn đề với WebView của loadData

String uri = Uri.encode(html); 
webview.loadData(uri, "text/html", "ISO-8859-1"); 

Khi hiển thị, các nhân vật latin1 được thay thế bằng ký tự lạ.

Nếu tôi tải html trực tiếp trong một TextView (chỉ để kiểm tra), các ký tự latin được hiển thị chính xác.

Bất kỳ ai cũng có thể trợ giúp?

Cảm ơn

html:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 

    <!-- some html --> 

</html> 
+0

Thiết bị của bạn có thể hỗ trợ phông chữ? – xDragonZ

+0

@ xDragonZ Tôi không chắc chắn ý bạn là gì, nhưng đó là một thiên hà và tôi có thể thấy các ký tự latin. – jul

+0

bản sao có thể có của [Android. WebView và loadData] (http://stackoverflow.com/questions/3961589/android-webview-and-loaddata) – ForceMagic

Trả lời

34

Chỉ cách để có nó làm việc, như nhận xét here:

webview.loadDataWithBaseURL("fake://not/needed", html, "text/html", "utf-8", ""); 

Không mã hóa URI, utf-8 ... loadData lỗi?

+0

Tôi nghĩ rằng chủ đề này đề xuất một giải pháp thanh lịch hơn: http://stackoverflow.com/questions/7412763/string- encoding-problem-in-webview – Sparky

+0

nó hoạt động..Cảm ơn rất nhiều ... –

+0

Tôi không thể hiển thị dấu chấm than ngược (¡, ¡, ¡) bằng bất kỳ phương pháp nào trong số này. Có ai biết làm thế nào để làm việc này xung quanh? –

0

AFAIK rằng: Thứ nhất, phương pháp loadData() được sử dụng để tải mã html thô.
Thứ hai, chỉ cần đặt mã html trực tiếp đến loadData(), không mã hóa nó

Bạn có thể muốn thử như thế này:

webview.loadData(uri, "text/html", "ISO-8859-1"); 

Cheers!

49
myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null); 

này hoạt động hoàn hảo, đặc biệt là trên Android 4.0, mà dường như bỏ qua nhân vật mã hóa bên HTML.

Được thử nghiệm trên 2,3 và 4.0.3.

Trong thực tế, tôi không có ý tưởng về những giá trị khác ngoài "base64" thực hiện tham số cuối cùng. Một số ví dụ của Google đặt null vào đó.

Bạn nên luôn sử dụng mã hóa UTF-8. Mọi mã hóa ký tự khác đã trở nên lỗi thời trong nhiều năm rồi.

+0

Đây là một hack thú vị ... nhưng hoạt động với tôi trên Android 4.3! Cảm ơn! – Chiubaka

+0

Cảm ơn, một hack tuyệt vời thực sự. Đã kiểm tra OK trên Android 4.4.2. –

+0

Chuỗi ở định dạng Unicode trong Java, làm cách nào để mã hóa nó bằng utf-8? – Shawn

7

Tôi có hiển thị © 2011 và nó đang hiển thị Â ©.

Với mã dưới đây tôi đã đạt được hiển thị giá trị đúng © 2011

webViewContent.loadDataWithBaseURL(null, html, "text/html", "utf-8", null); 
12
String start = "<html><head><meta http-equiv='Content-Type' content='text/html' charset='UTF-8' /></head><body>"; 
String end = "</body></html>"; 

webcontent.loadData(start+ YOURCONTENT + end, "text/html; charset=UTF-8", null); 

Một trong những giải pháp của vấn đề.

+0

Đây là thứ duy nhất có hiệu quả đối với tôi. Giải mã \ u ký tự (như \ u016b v.v.) – Rooster242

+0

Cảm ơn bạn, Tính năng này phù hợp với tôi. –

0

Tôi cũng gặp sự cố khi nhận được một ký tự kỳ lạ như Â ở đây và ở đó. Đã thử các tùy chọn khác nhau, nhưng tùy chọn hoạt động bên dưới.

String style_sheet_url = "http://something.com/assets/css/layout.css"; 
    String head = "<head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />" + 
      "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + style_sheet_url + "\" /></head>";  
    String locdata = "<html xmlns=\"http://www.w3.org/1999/xhtml\">" + head + "<body>"+ data + "</body></html>"; 
    wv_news_text.loadData(locdata, "text/html", "utf-8"); 

wv_news_text là WebView.

0

Thông tin từ Java tài liệu về phương pháp loadData

tải dữ liệu cho vào WebView này sử dụng một URL chương trình 'dữ liệu'.

Lưu ý rằng chính sách gốc của JavaScript có nghĩa là tập lệnh chạy trong một trang được tải bằng phương pháp này sẽ không thể truy cập nội dung được tải bằng cách sử dụng bất kỳ lược đồ nào khác 'dữ liệu', bao gồm 'http (s)'. Để tránh hạn chế này, hãy sử dụng loadDataWithBaseURL() với URL cơ sở thích hợp.

Tham số mã hóa chỉ định liệu dữ liệu là base64 hoặc URL được mã hóa. Nếu dữ liệu được mã hóa base64, giá trị của tham số mã hóa phải là 'base64'. Đối với tất cả các giá trị khác của thông số, bao gồm null, giả định rằng dữ liệu sử dụng mã hóa ASCII cho octet trong phạm vi của các ký tự URL an toàn và sử dụng mã hóa tiêu chuẩn % xx hex của URL cho octet ngoài phạm vi đó. Ví dụ: '#', '%', '\', '?' nên được thay thế bằng% 23,% 25,% 27,% 3f tương ứng.

URL lược đồ 'dữ liệu' được hình thành theo phương pháp này sử dụng bộ ký tự US-ASCII mặc định. Nếu bạn cần phải đặt một bộ ký tự khác, bạn nên tạo một URL lược đồ một 'dữ liệu' chỉ định rõ ràng thông số bộ ký tự trong phần phần trung bình của URL và chuỗi tải cuộc gọi (String) thay thế. Lưu ý rằng bộ ký tự thu được từ phần trung bình của dữ liệu URL luôn ghi đè được chỉ định trong tài liệu HTML hoặc XML .

Mã sau đã hoạt động đối với tôi.

String base64EncodedString = null; 
         try { 
          base64EncodedString = android.util.Base64.encodeToString((preString+mailContent.getBody()+postString).getBytes("UTF-8"), android.util.Base64.DEFAULT); 
         } catch (UnsupportedEncodingException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         } 
         if(base64EncodedString != null) 
         { 
          wvMailContent.loadData(base64EncodedString, "text/html; charset=utf-8", "base64"); 
         } 
         else 
         { 
          wvMailContent.loadData(preString+mailContent.getBody()+postString, "text/html; charset=utf-8", "utf-8"); 
0
webView.loadDataWithBaseURL(null, html, "text/html", "utf-8", null); 
Các vấn đề liên quan