অ্যান্ড্রয়েড। ওয়েবভিউ এবং লোডডেটা


104

ওয়েব-ভিউ লোডডেটা বিষয়বস্তুর সেটিংসের জন্য নিম্নলিখিত পদ্ধতিটি ব্যবহার করা সম্ভব (স্ট্রিং ডেটা, স্ট্রিং মাইমটাইপ, স্ট্রিং এনকোডিং)

এইচটিএমএল ডেটা অজানা এনকোডিং দিয়ে কীভাবে সমস্যাটি পরিচালনা করবেন ?!

এনকোডিংগুলির একটি তালিকা আছে ?!

আমি আমার কলেজ থেকে জানি যে আমার ক্ষেত্রে এইচটিএমএল ডিবি থেকে আসে এবং লাতিন -১ এর সাথে এনকোড থাকে। আমি ল্যাটিন -1 এ, আইএসও -8859-1 / আইসো -8859-1 এ এনকোডিং প্যারামিটার সেট করার চেষ্টা করি, তবে এখনও signs, ö, ü এর মতো বিশেষ চিহ্নগুলি প্রদর্শন করতে সমস্যা হয় ü

আমি কোনও পরামর্শের জন্য খুব কৃতজ্ঞ থাকব।

উত্তর:


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

এটি ত্রুটিহীনভাবে কাজ করে, বিশেষত অ্যান্ড্রয়েড on.০ এ, যা স্পষ্টতই এইচটিএমএল এর ভিতরে অক্ষর এনকোডিং উপেক্ষা করে ।

২.৩ এবং ৪.০.৩ এ পরীক্ষা করা হয়েছে।

আসলে, "বেস64" ব্যতীত শেষ প্যারামিটারটি গ্রহণ করে সে সম্পর্কে অন্যান্য মানগুলি সম্পর্কে আমার কোনও ধারণা নেই। গুগলের কয়েকটি উদাহরণ এটিকে বাতিল করে দেয়।


2
আপনার যদি US-ASCII চরসেটের বাইরে অক্ষর থাকে তবে এটি "নির্দোষভাবে" কাজ করতে পারে না।
আন্দ্রে নোভিকভ

1
কেবল একটি 4.2.2 ডিভাইসে চেষ্টা করেছেন এবং একটি কবজির মতো কাজ করে তবে একটি 2.3.6 ডিভাইসে এটি কেবল একই আবর্জনার অক্ষরগুলি দেখায়। : এস
ফ্রাঙ্ক

এটি আমার জন্য 4.1.2 এও কাজ করে (যারা এইচটিএমএলের অভ্যন্তরে চারসেটকেও উপেক্ষা করে) এবং লাতিন 1 এনকোডিং সহ! চিত্রে যান.
লুইস এ ফ্লোরিট

2
@ ফ্র্যাঙ্ক সেম, এখানে এইচটিসি-র একটি ২.৩..7 (সম্ভবত সমস্ত আদা রুটি) পরীক্ষা করা হয়েছে এবং একই আবর্জনা পেয়েছি, আমাকে অ্যান্ড্রে নোভিকভের সমাধানটি ব্যবহার করতে হবেWebView.loadDataWithBaseURL()
ফোর্স ম্যাজিক ২

আপনার উত্তর এবং: myWebView.loadData (myHtMLString, "পাঠ্য / এইচটিএমএল", "ইউটিএফ -8") মধ্যে পার্থক্য কী;
লু মর্দা

135

ওয়েবভিউ.লোডডাটা () মোটেও ঠিক মতো কাজ করছে না। আমার যা করতে হবে তা হ'ল:

String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
myWebView.loadData(header+myHtmlString, "text/html", "UTF-8");

আমি মনে করি আপনার ক্ষেত্রে আপনার ইউটিএফ -8টি লাটিন 1 বা আইএসও -8859-1 এর সাথে শিরোনাম এবং ওয়েবভিউ.লোডডেটা () উভয়ই প্রতিস্থাপন করা উচিত।

এবং, একটি পূর্ণ উত্তর দেওয়ার জন্য, এখানে এনকোডিংগুলির আনুষ্ঠানিক তালিকা দেওয়া হল: http://www.iana.org/assignments/character-sets

আমি আমার উত্তরটি আরও অন্তর্ভুক্ত করার জন্য আপডেট করছি:

ব্যবহার করার জন্য WebView.loadData () অ latin1 এনকোডিং সঙ্কেতাক্ষরে লিখা HTML সামগ্রী আপনার সঙ্গে। পূর্ববর্তী উদাহরণটি অ্যান্ড্রয়েড 4+ এ সঠিকভাবে কাজ করছে না, তাই আমি নীচের মত দেখতে এটি পরিবর্তন করেছি:

WebSettings settings = myWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
    String base64 = Base64.encodeToString(htmlString.getBytes(), Base64.DEFAULT);
    myWebView.loadData(base64, "text/html; charset=utf-8", "base64");
} else {
    String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
    myWebView.loadData(header + htmlString, "text/html; charset=UTF-8", null);

}

তবে পরে আমি ওয়েবভিউ.ডাউনড ডেটাওয়াইথব্যাস URL () এ স্যুইচ করেছি এবং কোডটি খুব পরিষ্কার হয়ে গেছে এবং অ্যান্ড্রয়েড সংস্করণের উপর নির্ভর করে নয়:

WebSettings settings = myWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");
myWebView.loadDataWithBaseURL(null, htmlString, "text/html", "utf-8", null);

কিছু কারণে এই ফাংশনগুলির সম্পূর্ণ আলাদা বাস্তবায়ন রয়েছে।


1
প্রিভেট, অ্যান্ড্রে আমি আপনার সমাধান চেষ্টা করেছি। দুর্ভাগ্যক্রমে এটি আমার পক্ষে কার্যকর হয়নি :(
টিমা

আমি বর্ণিত হিসাবে আপনি কি ইউটিএফ -8 চেষ্টা করেছেন? এখন যখন আমি আপনার প্রশ্নটি সম্পর্কে চিন্তা করি তখন এটি আমার কাছে ঘটে যায় যে জাভাতে সমস্ত স্ট্রিংগুলি ইউটিএফ -8 এ রয়েছে, সুতরাং আমার উদাহরণটি অক্ষতভাবে কাজ করা উচিত।
আন্দ্রে নোভিকভ

সমস্ত স্ট্রিংগুলি ইউটিএফ -8, তবে সার্ভার থেকে আসা পাঠ্যটি লাতিন -1 এ। আমি মনে করি, আমি ইউটিএফ -8 এবং লাতিন -1 এবং আইএসও -8859-1 দিয়ে চেষ্টা করেছি, তবে এখনও ü, ö, ä এর পরিবর্তে অদ্ভুত লক্ষণ দেখেছি ä তবে আমার আরেকটি ধারণা আছে, আমি ডান এনকোডিং ব্যবহার করে বাইট স্ট্রিমটিকে সার্ভার থেকে স্ট্রিংয়ে রূপান্তর করার চেষ্টা করব। হতে পারে, এটি আমাকে সাহায্য করবে
টিমা

4
4.0+ এ এনকোডিংটি মাইম প্রকারে খুব "পাঠ্য / এইচটিএমএল; চার্টসেট = utf-8" তে সেট করা উচিত, অন্যথায় এটি স্বীকৃত হবে না
মার্ভিনএক্সএক্সআইআইআই

2
শেষ স্নিপেট (লোডডাটা উইথব্যাস URL সহ এক) একটি 4.2.2 এবং 2.3.6 ডিভাইসে দুর্দান্ত কাজ করে: ডি
ফ্র্যাঙ্ক

36

আমি যেমন এটি বুঝতে পারি, loadData()কেবলমাত্র data:ডেটা সরবরাহের সাথে একটি URL তৈরি করে।

জাভাডোকগুলি এর জন্য পড়ুন loadData():

যদি এনকোডিং প্যারামিটারটির মান 'বেস64' হয়, তবে অবশ্যই ডেটা বেস 64 হিসাবে এনকোড করতে হবে। অন্যথায়, ডেটা অবশ্যই নিরাপদ ইউআরএল অক্ষরের ব্যাপ্তির অভ্যন্তরের অক্টেটের জন্য এএসসিআইআই এনকোডিং ব্যবহার করতে হবে এবং সেই ব্যাপ্তির বাইরে অক্সেটের জন্য ইউআরএলগুলির স্ট্যান্ডার্ড% xx হেক্সস এনকোডিংটি ব্যবহার করতে হবে। উদাহরণ স্বরূপ, '#', '%', '\', '?' যথাক্রমে% 23,% 25,% 27,% 3f দ্বারা প্রতিস্থাপন করা উচিত।

এই পদ্ধতি দ্বারা গঠিত 'ডেটা' স্কিম URL টি ডিফল্ট US-ASCII চরসেট ব্যবহার করে। আপনার যদি অন্য একটি চরসেট সেট করার প্রয়োজন হয়, আপনার একটি 'ডেটা' স্কিম URL তৈরি করা উচিত যা URL এর মিডিয়াটাইপ অংশে স্পষ্টভাবে একটি চরসেট প্যারামিটার নির্দিষ্ট করে এবং পরিবর্তে লোডআরএল (স্ট্রিং) কল করে। নোট করুন যে কোনও ডেটা ইউআরএল এর মিডিয়াটাইপ অংশ থেকে প্রাপ্ত চরসেটটি সর্বদা ওভাররাইড করে যা এইচটিএমএল বা এক্সএমএল নথিতেই উল্লিখিত হয়।

অতএব, আপনি হয় ইউএস-এএসসিআইআই ব্যবহার করুন এবং কোনও বিশেষ অক্ষর নিজেই এড়িয়ে চলুন বা বেস 64 ব্যবহার করে সমস্ত কিছু এনকোড করুন। আপনি ইউটিএফ -8 ব্যবহার করে ধরে নিচে নিম্নলিখিতটি কাজ করা উচিত (আমি ল্যাটিন 1 এর সাথে এটি পরীক্ষা করিনি):

String data = ...;  // the html data
String base64 = android.util.Base64.encodeToString(data.getBytes("UTF-8"), android.util.Base64.DEFAULT);
webView.loadData(base64, "text/html; charset=utf-8", "base64");

এটি আমাকে সর্বত্র ঘুরে দেখার আগে ডকুমেন্টেশন চেক করার জন্য মনে করিয়ে দিয়েছে!
প্রদীপ

উত্তর করার জন্য ধন্যবাদ! একটি ওয়েবভিউতে প্রাসঙ্গিক এইচটিএমএল সহায়তাতে নির্মিত বিভিন্ন বিল্ড লোড করা হয়েছিল এবং এটি কেবল কিছু সময় কাজ করেছিল। এটি এটি স্থির করেছে।
এরিক

20

আমার এই সমস্যা আছে তবে:

String content = "<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" /></head><body>";
content += mydata + "</body></html>";
WebView1.loadData(content, "text/html", "UTF-8");

সমস্ত ডিভাইসে কাজ করে না। এবং আমি কিছু পদ্ধতি মার্জ করি:

String content = 
       "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"+
       "<html><head>"+
       "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />"+
       "</head><body>";

content += myContent + "</body></html>";

WebView WebView1 = (WebView) findViewById(R.id.webView1);
WebView1.loadData(content, "text/html; charset=utf-8", "UTF-8");

এটা কাজ করে।


গুগল যা প্রস্তাব দেয় এটি তা নয়। আমার উত্তর দেখুন এবং ভিডিও আলাপ দেখুন ;-) stackoverflow.com/questions/3961589/…
পাস্কাল

7

এটি ব্যবহার করুন: স্ট্রিং কাস্টমএইচটিএমএল = পাঠ্য;

           wb.loadDataWithBaseURL(null,customHtml,"text/html", "UTF-8", null);

15 পোস্ট পরে এবং এটিই আমার জন্য কাজ করেছে
গাই কোথাল

5
 String strWebData="html...." //**Your html string**

 WebView webDetail=(WebView) findViewById(R.id.webView1);

 WebSettings websetting = webDetail.getSettings();

 websetting.setDefaultTextEncodingName("utf-8");

 webDetail.loadData(strWebData, "text/html; charset=utf-8", null);

5

সবচেয়ে নিরাপদ একটি ওয়েব দৃশ্য htmlContent লোড করতে পথ করা:

  1. বেস 64 এনকোডিং ব্যবহার করুন (সরকারী সুপারিশ)
  2. এইচটিএমএল বিষয়বস্তুর ধরণের জন্য ইউএফটি -8 নির্দিষ্ট করুন, যেমন, "পাঠ্য / এইচটিএমএল" (ব্যক্তিগত পরামর্শ) এর পরিবর্তে "পাঠ্য / এইচটিএমএল; চরসেট = utf-8"

"বেস64 এনকোডিং" হ'ল একটি অফিশিয়াল সুপারিশ যা আবার লেখা হয়েছে (ইতিমধ্যে জাভাদোক উপস্থিত রয়েছে) ক্রোমিনিয়ামের সর্বশেষ 01/2019 বাগে (ওয়েবভিউ এম 72 এ উপস্থিত (72.0.3626.76)):

https://bugs.chromium.org/p/chromium/issues/detail?id=929083

ক্রোমিয়াম দল থেকে সরকারী বিবৃতি:

"প্রস্তাবিত ফিক্স:
আমাদের দল আপনাকে বেস 64 এর সাথে ডেটা এনকোড করার প্রস্তাব দেয় so আমরা কীভাবে এটির জন্য উদাহরণ সরবরাহ করেছি:

এই ফিক্সটি পিছনের দিকে সামঞ্জস্যপূর্ণ (এটি পূর্ববর্তী ওয়েবভিউ সংস্করণগুলিতে কাজ করে), এবং এটি ভবিষ্যত-প্রমাণও হওয়া উচিত (আপনি সামগ্রীতে এনকোডিংয়ের ক্ষেত্রে ভবিষ্যতের সামঞ্জস্যতা সমস্যায় আঘাত করবেন না) ""

কোড নমুনা:

webView.loadData(
    Base64.encodeToString(
        htmlContent.getBytes(StandardCharsets.UTF_8),
        Base64.DEFAULT), // encode in Base64 encoded 
    "text/html; charset=utf-8", // utf-8 html content (personal recommendation)
    "base64"); // always use Base64 encoded data: NEVER PUT "utf-8" here (using base64 or not): This is wrong! 

1

উপরের উত্তরগুলি আমার ক্ষেত্রে কার্যকর হয় না। আপনাকে মেটা ট্যাগে utf-8 নির্দিষ্ট করতে হবে

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <!-- you content goes here -->
    </body>
</html>

-1

ওয়েবভিউ.লোডডাটা উইথবাসে URL (নাল, পাঠ্য, "পাঠ্য / এইচটিএমএল", "ইউটিএফ -8", নাল);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.