Android WebView với các ký tự UTF-8 bị cắt xén.


76

Tôi đang sử dụng một số chế độ xem web trong ứng dụng Android của mình nhưng không thể hiển thị chúng ở mã hóa utf-8.

Nếu sử dụng cái này, tôi sẽ không thấy các biểu tượng phong cách scandinavian của mình:

mWebView.loadUrl("file:///android_asset/om.html")

Và nếu thử cái này, tôi sẽ không hiển thị gì cả

mWebView.loadDataWithBaseURL("file:///android_asset/om.html", null, "text/html", "utf-8",null);

Trân trọng


1
mặc dù đây là bản sao của android-webview-utf-8-not-display , giải pháp được chấp nhận từ năm 2010 không hoạt động với các phiên bản android mới hơn. Câu trả lời từ @ Cameron Lowell Palmer và @R Earle Harris trong câu hỏi này chứa thông tin phù hợp với các phiên bản android mới hơn
k3b

Chính xác thì nó tương tự, nhưng không trùng lặp và điều này thể hiện một câu hỏi và câu trả lời chung chung mạnh mẽ hơn. Vui lòng bỏ phiếu để mở lại.
Cameron Lowell Palmer

Elena sys Có vẻ như việc bạn kết thúc câu hỏi này là hơi tự phục vụ. Các câu trả lời ở đây được đánh giá cao hơn câu trả lời của bạn, chính xác là vì câu hỏi đủ khác biệt và các câu trả lời mạnh hơn.
Cameron Lowell Palmer

Đây là một câu hỏi trùng lặp của: stackoverflow.com/questions/3312643/…
Jorgesys

@Elenasys không đồng ý. Nó tương tự, nhưng đủ khác nhau.
Cameron Lowell Palmer

Câu trả lời:


152

Bạn có thể thử chỉnh sửa cài đặt của chế độ xem web trước khi tải dữ liệu:

WebSettings settings = mWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");

Ngoài ra, như được cung cấp trong nhận xét bên dưới, hãy nhớ thêm "charset=utf-8"vào lệnh gọi loadData:

mWebView.loadData(getString(R.string.info_texto), "text/html; charset=utf-8", "utf-8");

1
Điều này sẽ không hoạt động như được mô tả trong câu trả lời của tôi. Vấn đề là một lỗi trong phương pháp và chỉ định mã hóa UTF-8 trong khi cần thiết không phải là tất cả những gì bạn cần làm.
Cameron Lowell Palmer,

2
Tính năng này hoạt động với Android 2.2, nhưng để nó hoạt động với Android 4.04, bạn cần sử dụng loadDataWithBaseURL()phương pháp do Cameron đề xuất .
sulai

43
Điều đó hoạt động đối với tôi trên Android 2.2.1, 4.0.4, 4.1.2. Bạn cũng cần thêm "charset = utf-8" vào lệnh gọi loadData. Như vậy: webview.loadData (getString (R.string.info_texto), "text / html; charset = utf-8", "utf-8");
Derzu

130

Điều này dường như đã bị phá vỡ trong một số hình thức hoặc thời trang mãi mãi. Chương 1733

Sử dụng loadDataWithBaseURL thay vì loadData.

// Pretend this is an html document with those three characters
String scandinavianCharacters = "øæå";

// Won't render correctly
webView.loadData(scandinavianCharacters, "text/html", "UTF-8");

// Will render correctly
webView.loadDataWithBaseURL(null, scandinavianCharacters, "text/html", "UTF-8", null);

Bây giờ, phần thực sự khó chịu là trên Samsung Galaxy S II (4.0.3) loadData () hoạt động tốt, nhưng thử nghiệm trên Galaxy Nexus (4.0.2), các ký tự nhiều byte bị cắt xén trừ khi bạn sử dụng loadDataWithBaseURL ( ). Tài liệu WebView

Các phiên bản gần đây của Android

Một số đang báo cáo sự thay đổi trong hành vi của các lệnh gọi loadData yêu cầu mimeTypephải bao gồm charset=utf-8.

webView.loadData(scandinavianCharacters, "text/html; charset=utf-8", "UTF-8");

Bạn cũng có thể sử dụng công thức này với WebSettings

WebView webView = (WebView) findViewById(R.id.DemoWebView);
WebSettings webSettings = webView.getSettings();
webSettings.setDefaultTextEncodingName("utf-8");  
webView.loadData(scandinavianCharacters, "text/html; charset=utf-8", null);

Thật ngạc nhiên là Android vẫn chưa giải quyết được vấn đề cơ bản này.


1
Cám ơn vì cái này. Làm việc cho tôi khá tốt.
Sean Glover

1
Cảm ơn bạn, hoạt động tốt cho tôi trên Galaxy S3 của tôi. Thật khó chịu.
nspo

Tôi không thể hiển thị dấu chấm than đảo ngược (¡, & # 161 ;, & iexcl;) 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?
Cassio Landim

2
Tôi đang sử dụng Android 4.4.4 và không phù hợp với tôi. text/html; charset=utf-8đã làm việc.
Azad

1
Sẽ thật tuyệt nếu có câu trả lời dứt khoát về mức độ API nào mà điều này đã thay đổi. Trong thử nghiệm trên Samsung Galaxy S3 (API 16) "text / html; charset = utf-8" cho kết quả là văn bản bị cắt xén trong khi "text / html" hoạt động. Trên Moto G (API 23) thì ngược lại, tôi đã sử dụng if (Build.VERSION.SDK_INT> 16) để chọn chuỗi mã hóa, nhưng tôi lo ngại rằng điều này vẫn sẽ không hoạt động với tất cả các thiết bị / các cấp API
QuantumTiger

27

Derzu's bit rất hữu ích ở trên:

webview.loadData(getString(R.string.info_texto), "text/html; charset=utf-8", "utf-8"); 

Tôi đã có utf-8 trên Adroid 2.x và cắt ansi trên 4.x cho đến khi tôi đưa vào

 charset=utf-8

trong lệnh gọi wv.loadUrlW Anything (). Chú ý tuyệt vời đến từng chi tiết, Derzu


Cài đặt bổ sung được mô tả stackoverflow.com/a/4933345/866333 bởi Eric Nordvik thậm chí không cần thiết. Ít nhất là không cho 4.1.2
John

Lớn: tiết kiệm thời gian của tôi
Dhruvil Patel

12

Có hai cách mà một trang HTML được phân phối bởi máy chủ HTTP có thể chỉ định mã hóa nội dung. Thông thường, máy chủ sẽ chỉ định mã hóa nội dung trong tiêu đề HTTP, nhưng vì trang này đang được tải từ một tệp, không có giao dịch HTTP nào và do đó không có tiêu đề. Do đó, WebView giả định mã hóa mặc định là Latin-1.

Tuy nhiên, bạn có thể chỉ định mã hóa nội dung bằng <meta>thẻ. Tạo tệp html của bạn do đó:

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Title</title>
</head>
Your content following

Và sau đó tải nó vào WebView bằng cách sử dụng mWebView.loadUrl("file:///android_asset/om.html");. Nó sẽ hiển thị các ký tự không phải latin như bạn mong đợi.


2
Giải pháp này là giải pháp tôi cần, vì tôi tải nội dung html qua tệp. Cảm ơn: D
Agung Pratama 23/02

9
WebView wv = (WebView) findViewById(R.id.rowWebview);
WebSettings settings = wv.getSettings();
settings.setDefaultTextEncodingName("utf-8");                   
wv.loadData(topHtml, "text/html; charset=utf-8",null);

Sự kết hợp của cả hai dường như hiệu quả đối với tôi. Vì lý do nào đó, nó thích null trên bảng mã và bộ ký tự trong kiểu mime: / kỳ lạ. điều này đã giải quyết được nhiều tháng tăng nặng cho tôi.


Vâng, chỉ có hai cài đặt này của "utf-8" cũng giúp tôi. Các metatừ khóa <meta http-equiv="content-type" content="text/html; charset=UTF-8">vừa giúp khi tôi còn sử dụng loadUrlnhưng đã bị bỏ qua khi sử dụng loadData(thử nghiệm trên API 16 + 21).
Dirk

2

Bạn cần hoán đổi hai đối số đầu tiên của mình. Xem chuỗi này: Android WebView UTF-8 không hiển thị

Vì vậy, mã của bạn sẽ giống như sau:

mWebView.loadDataWithBaseURL(null, "file:///android_asset/om.html", "text/html", "utf-8",null);

2
Theo các tài liệu theo đúng thứ tự là: public void loadDataWithBaseURL (String baseUrl, dữ liệu String, String MIMETYPE, String mã hóa, String historyUrl)
Cameron Lowell Palmer

Có, tài liệu là chính xác. Câu trả lời của tôi có tính đến điều đó. URL cơ sở là URL cần phải trống.
Sparky

Thực tế là tải trọng của bạn là một chuỗi với tệp: // thông qua tôi.
Cameron Lowell Palmer

1

Bạn nên ghi nhớ 3 điều để luôn hiển thị đúng nội dung:

  1. Sử dụng loadDataWithBaseUrl thay vì loadData funciton.
  2. Đặt mã hóa chính xác trong tệp html làm thẻ meta
  3. Đặt defaultTextEncodingName trong WebSettings

Các ví dụ đã được cung cấp thông qua các câu trả lời khác nên tôi không lặp lại!


Bạn đã giải thích về cách xem nội dung có chứa utf-8, nhưng còn về việc chia sẻ url chứa utf-8, như liên kết này (Tôi muốn chia sẻ Url trong ứng dụng của mình với các mạng xã hội): yazd20.com//News/2015/11/ استند-آب-كمدي-حسن-ريوندي-در-يزد. Html
Ahmad Ebrahimi

0

Tôi không chắc bạn đang làm gì trước khi tải trang đó. Thay đổi bảo mật này có liên quan gì đến nó không? Bạn có đang tải trang từ web trước đây không?

Lưu ý cho bài 1.0. Do sự thay đổi trong WebKit, quyền truy cập vào các tệp nội dung thông qua "tệp: /// android_asset /" cho các tài nguyên phụ bị hạn chế hơn. Nếu bạn cung cấp chuỗi rỗng hoặc chuỗi rỗng dưới dạng baseUrl, bạn sẽ không thể truy cập tệp nội dung. Nếu baseUrl là bất kỳ thứ gì khác ngoài http (s) / ftp (s) / about / javascript dưới dạng lược đồ, bạn có thể truy cập các tệp nội dung cho các tài nguyên phụ.

Lấy từ đây: http://developer.android.com/reference/android/webkit/WebView.html Trong phần về phương pháp "loadDataWithBaseURL".

Bạn có thể sử dụng "loadData" để kiểm tra nhanh không? Chỉ định "utf-8" cho mã hóa và dán một ký tự scandinavian vào phân vùng dữ liệu. Kiểm tra đơn giản để loại bỏ vấn đề bảo mật.


0
mwebView.loadData(URLEncoder.encode(data, "utf-8").replaceAll("\\+"," "), "text/html", "utf-8");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.