2018 আপডেট:
ফেব্রুয়ারী 2018 পর্যন্ত, এর মতো সংকোচনের ব্যবহারগুলি বেশ জনপ্রিয়gzip
হয়ে উঠেছে (গুগল, ইউটিউব, ইয়াহু, উইকিপিডিয়া, রেডডিট, স্ট্যাক ওভারফ্লো এবং স্ট্যাক এক্সচেঞ্জ নেটওয়ার্ক সাইটগুলির মতো বৃহত সাইটগুলি সহ, সমস্ত ওয়েবসাইটের প্রায় 73% এটি ব্যবহার করে)।
আপনি যদি গিজপযুক্ত প্রতিক্রিয়া সহ মূল উত্তরের মতো একটি সাধারণ ডিকোড করেন তবে আপনি এর মতো বা অনুরূপ একটি ত্রুটি পাবেন:
ইউনিকোড ডিকোড এরিয়ার: 'utf8' কোডেক 1x8b পজিশনে বাইট ডিকোড করতে পারে না: অপ্রত্যাশিত কোড বাইট
একটি জিপিপিপড প্রতিক্রিয়া ডিকোড করার জন্য আপনাকে নিম্নলিখিত মডিউলগুলি যুক্ত করতে হবে (পাইথন 3 এ):
import gzip
import io
দ্রষ্টব্য: পাইথন 2 এ আপনি এর StringIO
পরিবর্তে ব্যবহার করতে চানio
তারপরে আপনি বিষয়বস্তুটিকে এভাবে পার্স করতে পারেন:
response = urlopen("https://example.com/gzipped-ressource")
buffer = io.BytesIO(response.read()) # Use StringIO.StringIO(response.read()) in Python 2
gzipped_file = gzip.GzipFile(fileobj=buffer)
decoded = gzipped_file.read()
content = decoded.decode("utf-8") # Replace utf-8 with the source encoding of your requested resource
এই কোডটি প্রতিক্রিয়া পড়ে, এবং একটি বাফারে বাইট রাখে। gzip
মডিউল তারপর বাফার ব্যবহার সার্চ GZipFile
ফাংশন। এর পরে, জিজেপ করা ফাইলটি আবার বাইটে পড়তে পারে এবং শেষ পর্যন্ত সাধারণত পাঠযোগ্য পাঠ্যে ডিকোড করা যায়।
2010 থেকে আসল উত্তর:
আমরা কি ব্যবহারের জন্য আসল মান পেতে পারি link
?
তদাতিরিক্ত, আমরা .encode()
ইতিমধ্যে এখানে এনকোডড বাইট স্ট্রিংয়ের চেষ্টা করার সময় আমরা এখানে সাধারণত এই সমস্যাটির মুখোমুখি হই । সুতরাং আপনি প্রথম হিসাবে এটি ডিকোড করার চেষ্টা করতে পারেন
html = urllib.urlopen(link).read()
unicode_str = html.decode(<source encoding>)
encoded_str = unicode_str.encode("utf8")
উদাহরণ হিসাবে:
html = '\xa0'
encoded_str = html.encode("utf8")
ব্যর্থ হয়
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 0: ordinal not in range(128)
যদিও:
html = '\xa0'
decoded_str = html.decode("windows-1252")
encoded_str = decoded_str.encode("utf8")
ত্রুটি ছাড়াই সফল। মনে রাখবেন যে "উইন্ডোজ -১২২২" এমন একটি জিনিস যা আমি উদাহরণ হিসাবে ব্যবহার করেছি । আমি এটি চারডিট থেকে পেয়েছি এবং এটির 0.5 আস্থা ছিল যে এটি ঠিক! (ভাল, 1-বর্ণ-দৈর্ঘ্যের স্ট্রিংয়ের সাথে দেওয়া হিসাবে, আপনি কী আশা করেন) .urlopen().read()
আপনার পুনরুদ্ধার করা সামগ্রীতে প্রযোজ্য বিষয়গুলি থেকে ফিরে আসা বাইট স্ট্রিংয়ের এনকোডিংয়ে আপনাকে এটি পরিবর্তন করা উচিত ।
আমি আর একটি সমস্যা দেখতে পাচ্ছি যে .encode()
স্ট্রিং পদ্ধতিটি পরিবর্তিত স্ট্রিংটি ফিরিয়ে দেয় এবং উত্সটি জায়গায় পরিবর্তিত করে না। সুতরাং self.response.out.write(html)
এইচটিএমএল থাকা কোনও ধরণের বেহুদাবাদ এইচটিএমএল.এনকোডের এনকোডযুক্ত স্ট্রিং নয় (যদি এটিই আপনি মূলত লক্ষ্য করছিলেন)।
Ignacio হিসাবে পরামর্শ হিসাবে, ফিরে আসা স্ট্রিংয়ের প্রকৃত এনকোডিংয়ের জন্য উত্স ওয়েবপৃষ্ঠাটি পরীক্ষা করুন read()
। এটি হয় মেটা ট্যাগগুলির মধ্যে একটিতে বা প্রতিক্রিয়াতে কন্টেন্টটাইপ শিরোনামে। প্যারামিটার হিসাবে এটি ব্যবহার করুন .decode()
।
তবে মনে রাখবেন যে এটি অনুমান করা উচিত নয় যে অন্যান্য বিকাশকারীরা হেডার এবং / বা মেটা অক্ষর সেট ঘোষণাগুলি প্রকৃত সামগ্রীর সাথে মেলে কিনা তা নিশ্চিত করার জন্য যথেষ্ট দায়বদ্ধ। (যা পিটা, হ্যাঁ, আমার জানা উচিত, আমি তাদের আগে একজন ছিলাম )।