Tarayıcıların "bozuk" sorunundan asla korkmayın!

Yazar | Ding Yanjun

Baş Editör | Zhong Peiyi

Kısa süre önce bir hayran benden tavsiye istedi. Belirli bir web sitesini tararken, web sayfasının kaynak kodunda Çince bir sorun vardı. Bu makale, web tarayıcılarının sizinle birlikte karmaşık bir şekilde ele alınışını özetleyecektir. Bunun sadece Çince değil, aynı zamanda Japonca, Korece, Rusça ve Tibetçe gibi bazı karışık işlemler olduğuna dikkat edin Çözümleri aynı olduğu için burada açıklanmıştır.

Bozuk karakterlerin ortaya çıkışı

51job web sitesini tarama örneğini ele alarak neden "bozuk" bir sorun olduğu, nasıl çözüleceği ve arkasındaki mekanizma hakkında konuşun.

Kod örneği:

ithalat istekleri url = " res = request.get (url) baskı (res.text)

Sonucu göster:

Res.text'i yazdırdığınızda ne buldunuz? Çinliler bozuldu! ! ! Ancak, web sayfasının karakter kümesi türünün GBK kodlama biçimini kullandığı bulunmuştur.

İsteklerin, HTTP başlığına dayalı olarak yanıtın kodlanması hakkında bilgiye dayalı bir tahmin yapacağını biliyoruz. R.text'e eriştiğinizde, Requests onun türetilmiş metin kodlamasını kullanır. İstekler tarafından hangi kodlamanın kullanıldığını öğrenebilir ve bunu değiştirmek için r.encoding özelliğini kullanabilirsiniz.

Ardından, İsteklerin, bazı Resquests kullanımları aracılığıyla HTTP başlıklarına dayalı yanıtları nasıl kodladığına bir göz atalım.

print (res.encoding) # Web sayfası tarafından döndürülen karakter kümesinin türünü görüntüleyin print (res.apparent_encoding) # Karakter kümesi türünü otomatik olarak belirleyin

Çıktı:

İstekler tarafından speküle edilen metin kodlamasının (yani, web sayfası döndürüldükten ve aşağı tarandıktan sonraki kodlama dönüşümü) kaynak web sayfası kodlamasıyla tutarsız olduğu ve bunun bozuk kodun nedeni olduğunu gösteren tespit edilebilir.

Bozukların arkasındaki gizem

Kaynak web sayfası kodlaması, taramadan sonra kodlama dönüşümüyle tutarsız olduğunda, örneğin, kaynak web sayfası GBK kodlu bayt akışıdır ve biz onu yakaladıktan sonra program, kodlamak ve depolama dosyasına çıktı vermek için doğrudan UTF-8 kullanır. Bozuk kodlara neden olmak, yani kaynak web sayfası kodu, program tarafından yakalandıktan hemen sonra kullanılan kodla aynı olduğunda, bozuk kodlar görünmeyecektir.Şu anda, tek tip karakter kodlaması bozuk görünmeyecektir. Son olarak, taranan tüm web sayfaları, kodlama biçimine bakılmaksızın depolama için UTF-8 biçimine dönüştürülür.

Not: Kaynak ağ kodu A-GBK, doğrudan B-ISO-8859-1 programı tarafından kullanılan kod ve birleşik dönüştürme karakter kodu C-UTF-8'i ayırt edin.

Burada, kabaca aşağıdaki Unicode, ISO-8859-1, GBK2312, GBK, UTF-8 vb. Arasındaki farkları genişletiyoruz:

En eski kodlama, ASCII kodlamasına benzeyen ISO8859-1'dir. Ancak çeşitli dilleri ifade etmenin rahatlığı için birçok standart kod yavaş yavaş ortaya çıktı. ISO8859-1, tek baytlık bir kodlamadır ve gösterilebilecek maksimum karakter aralığı, İngilizce serilerde kullanılan 0-255'tir. Açıkçası, ISO8859-1 kodlamasıyla temsil edilen karakter aralığı çok dardır ve Çince karakterleri temsil edemez.

1981'de Çinliler GB2312 kodunu ASCII kodunun Çince genişlemesi ve dönüşümü yoluyla geliştirdi ve bu da 6000'den fazla yaygın olarak kullanılan Çince karakteri temsil edebilir. Ancak geleneksel karakterler ve çeşitli karakterler de dahil olmak üzere çok fazla Çince karakter var, bu nedenle GB2312'deki kodlamayı içeren GBK kodlaması üretildi ve aynı zamanda çok genişledi. Çin aynı zamanda çok etnili bir ülkedir.Hemen hemen her etnik grubun kendi bağımsız dil sistemi vardır.Bu karakterleri ifade etmek için GBK kodlaması GB18030'a genişletilmeye devam edilmektedir. Çin gibi, her ülke kendi dilini kodlar, bu nedenle çeşitli kodlar görünür.Eğer ilgili kodu kurmazsanız, karşılık gelen kodun ne ifade etmek istediğini açıklayamazsınız. Son olarak, ISO adlı bir kuruluş buna daha fazla dayanamıyordu. Birlikte, dünyadaki herhangi bir metin ve logoyu tutacak kadar büyük, çok büyük bir kodlama Unicode oluşturdular. Bu nedenle, bilgisayarda bir Unicode kodlama sistemi olduğu sürece, dünyada ne tür bir metin olursa olsun, yalnızca dosyayı kaydetmeniz gerektiğinde, Unicode kodlama normalde diğer bilgisayarlar tarafından yorumlanabilir. Unicode'un ağ iletiminde, her biri sırasıyla 8 bit ve 16 bit ileten iki standart, UTF-8 ve UTF-16 ortaya çıktı. Öyleyse bazı insanların soruları olacaktır UTF-8 bu kadar çok karakter ve sembolü saklayabildiğine göre, Çin'de neden GBK ve diğer kodlamaları kullanan bu kadar çok insan var? UTF-8 gibi kodlamalar nispeten büyük olduğundan ve daha fazla bilgisayar alanı kapladığından, hedef kullanıcıların çoğu Çinli ise, GBK gibi kodlamalar da kullanılabilir.

Şu şekilde de anlaşılabilir: Bir dizge karakterlerden oluşur ve karakterler bilgisayar donanımında ikili biçimde depolanır ve bu ikili biçim bir koddur. Doğrudan "dizge karakter ikili gösterim (kodlama)" kullanırsanız, farklı kodlama türleri arasındaki dönüşümün karmaşıklığını artıracaktır. Böylece, "karakter dizisi karakter depolamadan bağımsız gösterim ikili gösterim (kodlama)" şeklinde bir soyutlama katmanı sunulur. Bu şekilde, karakterler depolamadan bağımsız bir biçimde temsil edilebilir ve farklı kodlamalar arasında dönüşüm önce yapılabilir Bu soyutlama katmanına ve daha sonra diğer kodlama formlarına dönüştürülür. Burada, Unicode "depolamadan bağımsız gösterim" ve UTF-8 "ikili gösterim" dir.

Bozuk çözüm

Nedeni temel alan bir çözüm bulmak çok basit.

Yöntem 1: doğrudan çözüm kodlamasını belirtin

ithalat istekleri url = " res = request.get (url) res.encoding = "gbk" html = res.text baskı (html)

Yöntem 2: res.apparent_encoding özniteliğine göre belirtin

ithalat istekleri url = " res = request.get (url) res.encoding = res.apparent_encoding html = res.text baskı (html)

Yöntem 3: Kodlama ve kod çözme yoluyla

ithalat istekleri url = " res = request.get (url) html = res.text.encode ('iso-8859-1'). decode ('gbk') baskı (html)

Çıktı sonucu:

Temel fikir üç adımdır: A --- GBK kodlayan kaynak web sayfasını belirleyin, program kaynak web sayfası verilerini geri yüklemek için B --- ISO-8859-1 kodlamasını geçer ve C-UTF-8 karakter kodlamasını düzgün bir şekilde dönüştürür. Neden birleşik bir kod dönüştürme adımı var? Web gezgini sistemi birçok veri kaynağına sahiptir, verilerin kullanılması imkansız olduğunda, çok kullanışsız olan orijinal verilerine dönüştürülebilir. Bu nedenle, genel tarayıcı sistemi, tutarlı ve kullanımı kolay olacak şekilde taranan sonuçları aynı şekilde kodlamalıdır.

Örneğin, web sayfası verilerini kaydetmek istiyorsak, UTF-8'e dönüştürülecektir, kod aşağıdaki gibidir:

f olarak open ("a.txt", 'w', kodlama = 'utf-8') ile: f.write (html)

sonuç olarak

Web tarayıcılarındaki bozuk karakterler sorunuyla ilgili olarak, burada sadece bir çözüm değil, aynı zamanda onun arkasındaki ilkeler de var.Bu soru UTF-8, GBK ve GB2312 kodlama yöntemleri gibi birçok ilginç soruyu beraberinde getiriyor? Bu dönüşüm sorunu neden çözebilir?

Son olarak, her programcıya beyninizi daha çok kullanın, daha çok düşünün, daha çok özetleyin!

Bu makale yazar tarafından sunulmuştur ve telif hakkı kendisine aittir.

çöküş! Sina programcısı, fazla mesai için yıllık 770.000 toplantı ödülünü kaçırdı
önceki
BMW'ye gücü yetmeyenler, bir göz atın Brilliance China V9 Eylül'de piyasaya sürülecek
Sonraki
Anti-rutin bir araba satın almak: Bir araba satın almak için bir 4S mağazasına gitmeli miyim?
Saf elektrikli MG EZS mühendislik aracının başlangıç testinin heyecanını yaşayın
Bir araba rutin karşıtı satın almak: yeni araba teklifindeki "kedi"
GAC New Energy Beijing Xinminheng 25 saat deneyim merkezi kuruldu
Qingdao'da düzenlenen Qingdao Oriental Movie Capital Ulusal Grup Performans Yarışması finalleri
Kimse mobil geliştirme istemiyor mu?
Kapı anormal ise kapı bilgilendirilecektir.
Qingdao Zhenjiang Road İlköğretim Okulu "Lacivert Ordunun Ruhunu Oluşturuyor ve Çin Rüyasını Uçuruyor" Deniz Ulusal Savunma Araştırma Haftası'nı başlattı
Bugünün Toutiao'su WeChat'e karşı "Multi-Flash" gönderebilir; Kuaibo Wang Xin tuvalet MT'si engellendi | Geek Headlines
Pekin'de 59 hane "Huitian bölgesine" iki binden fazla iş gönderdi
Zhejiang Gözlemi | Kuaishou halka açılmayı planlıyor, kısa video nakit paranın hala bir sorun olduğunu anlamak için para yakan bir savaş sahneledi
Qingdao West Coast Ekolojik Gezi Parkı en iyi çiçek izleme dönemine giriyor
To Top