python 編碼問題之終極解決

結合之前遇到的坑以及下面貼的這篇文章, 總結幾種python亂碼解決方案,如果遇到亂碼,不妨嘗試一下?

1,必備

#encoding=utf-8

2, python編程環境編碼

import sys
reload(sys)
sys.setdefaultencoding('utf8')

?

3,不知道神馬編碼的時候用chardet查一下

from chardet import detect  # detect(str),參數只能是str,不能是unicode編碼的
if not isinstance(line, unicode):line = line.decode(detect(line)['encoding']).rstrip().lower()

4,mysql 的默認字符集 latin1,Latin1是ISO-8859-1的別名,有些環境下寫作Latin-1,ISO-8859-1編碼是單字節編碼,向下兼容ASCII


try
:line = line.rstrip().decode("utf-8").lower() except UnicodeDecodeError:line = line.decode('latin-1').rstrip().lower() # 很多網頁采用這種編碼格式,爬取網頁的時候會遇到

5,讀取oracle中文遇到問題的話,設置一下客戶端編碼

import os
os.environ['NLS_LANG']
= 'SIMPLIFIED CHINESE_CHINA.UTF8'

?

6, 非常好用的codecs, GB2312 < GBK < GB18030

import codecs         # 下載的txt文本在mac上打開亂碼,這樣子轉一下就好了
fo = codecs.open('/Users/baidu/Desktop/spark/現代漢語常用詞表.txt', 'rb', 'gbk') fo = codecs.open('/Users/baidu/Desktop/spark/現代漢語常用詞表.txt', 'rb', 'utf8') fo = codecs.open('/Users/baidu/Desktop/spark/現代漢語常用詞表.txt', 'rb', 'gb18030')

混合編碼的情況最煩人,可以采用try:....UnicodeDecodeError:....去嘗試不同解碼方法,或者用chardet先檢測再解碼(但是有些編碼格式字符串找不到解碼方式)

總之,讀進來先統一解碼為unicode的格式,寫出去都同一編寫為utf-8格式(除非特殊要求)

附上各種編碼教程 http://www.crifan.com/character_encoding_charset_simpile_tutorial/

?

?

【整理】Python中遇到"UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence"之類的編碼或解碼的錯誤時如何處理
原文? http://www.crifan.com/summary_python_unicodedecode_error_possible_reasons_and_solutions/


問題參見:

python2.7 urllib2 抓取新浪亂碼

中的:

報錯的異常是? ?
UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence

此問題,還是很具有代表性的,此處,專門整理如下:

【Python中如何處理UnicodeDecodeError和UnicodeEncodeError】

簡答:

1.仔細分析錯誤的類型

2.搞清自己處理的字符串是什么類型的

3.然后換用這種的字符編碼去編碼或解碼

詳解:

以上面的錯誤:

UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence

為例,去解釋,如何處理這類問題:

1.仔細分析錯誤的類型

(1)錯誤是Unicode的編碼還是解碼

對于此處,錯誤是:

UnicodeDecodeError
的類型的。

此英文,對應的中文的含義,其實已經很清楚了:

Unicode的解碼(Decode)出現錯誤(Error)了

而對于上面這句,我們可以推斷出:

你當前正在處理某種編碼類型的字符串
此處你要處理字符串,是想要將該字符串去解碼decode,變成Unicode
但是將該字符串解碼變成Unicode期間,卻出錯了
(2)所用的是何種編碼

好的,接著看上面的錯誤:

‘gbk’ codec can’t decode
使得錯誤信息更加明顯了:

你此處,要將字符串解碼為Unicode,是以gbk編碼的方式去解碼(該字符串變成Unicode)的
但是此處通過gbk的方式,卻無法解碼(can’t decode )
注:此處的codec,意思是:編解碼(器),是Python內部的模塊,用來編碼或解碼(字符串)的
(3)錯誤位置

bytes in position 2-3

此處的信息,后續一般也很少用到。

有時候會用于定位具體錯誤的位置。

此處暫且忽略。

(4)錯誤的細節錯誤類型

illegal multibyte sequence

翻譯為中文為:

非法的,多字節,序列

簡單說就是:

沒法(解碼)了。

【原因及解決辦法】

好了,針對于上面所分析出來的信息:

將一個字符串,通過gbk的方式,去解碼,想要獲得Unicode字符串,結果出錯了

我們來說說原因和解決辦法:

此種錯誤,有幾種可能:
(1)要處理的字符串本身不是gbk編碼,但是你卻以gbk編碼去解碼
比如,字符串本身是utf-8的,但是你卻用gbk去解碼utf-8的字符串,所以結果不用說,則必然出錯

則必然會出現這類的錯誤,說是,用gbk的方式去解碼字符串,想要獲得Unicode字符串,但是結果卻解碼出錯了

解決辦法:

如果你確定當前字符串,比如抓取網頁通過charset=utf-8,已經確定html的字符串是utf-8的,

則可以直接去通過utf-8去解碼。

相關參考內容:

詳解抓取網站,模擬登陸,抓取動態網頁的原理和實現(Python,C#等)

中的:

【整理】關于HTML網頁源碼的字符編碼(charset)格式(GB2312,GBK,UTF-8,ISO8859-1等)的解釋

而如果本身對于所處理的字符串,不太清楚是什么編碼類型的,可以嘗試去通過chardet等模塊,去檢測看看:

【教程】如何用Python中的chardet去檢測字符編碼類型

然后搞清楚了,確定了,字符串是什么類型,然后再去解碼。

提示:

關于字符串編碼的類型,作為背景學習知識,也應該去了解一下。

這樣對于以后處理字符串方面,會更有幫助。

(2)你沒有主動的去將字符串編碼為對應的Unicode,但是結果也報上面的UnicodeDecodeError的錯誤

這個情況,最常見的,就是我之前在:

【總結】Python 2.x中常見字符編碼和解碼方面的錯誤及其解決辦法

所整理過的:

“Python中,打印字符串時,字符串本身的編碼,與輸出終端中所用編碼不匹配”

此處不再贅述,只簡要再說一下:

如果你本身拿到的是utf-8等,非gbk編碼的字符串,然后用print去打印出來

在windows系統就是輸出到cmd中

而cmd中,(對于多數中國人所用的是中文的系統)默認字符編碼是gbk

從而導致此種現象:

python要將utf-8編碼的字符串,在gbk的cmd的中打印出來

所以先要去嘗試,用gbk的編碼,解碼為Unicode然后再打印出來

結果就出現此處的錯誤了。

詳細解釋,還是參見上面的教程。

其中還有示例代碼的。

(3)處理的字符的確是gbk的,但是其中夾雜的部分特殊字符,是gbk編碼中所沒有的
如果有些特殊字符是GB18030中有的,但是是gbk中沒有的。
則用gbk去解碼,去所不支持的字符,也比如會出錯。
所以,此種情況,可以嘗試用和當前編碼(gbk)所兼容的但所包含字符更多的編碼(gb18030)去解碼,或許就可以了。

提示:

如果對于GBK,GB18030,以及GB2312不了解,則可參考:

字符編碼簡明教程

另外:

如果遇到其他的,類似此中錯誤的,比如:

UnicodeEncodeError: 'gbk' codec can't encode character u'\u3232' in position 0: illegal multibyte sequence
等類型的錯誤,你就可以按照上述的思路,去分析,錯誤的現象,原因,然后通過自己,就可以找到解決辦法了。

注:

其他和這類錯誤相關的,也還有一些可以參考的:

【總結】靜態網頁抓取,動態網頁抓取,模擬登陸的注意事項和心得

中的:“返回的html內容是亂碼”

轉載于:https://www.cnblogs.com/fkissx/p/5417363.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374803.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374803.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GWT 2 Spring 3 JPA 2 Hibernate 3.5教程

本分步指南將介紹如何使用開發一個簡單的Web應用程序 Google的網絡工具包 &#xff08;GWT&#xff09;用于富客戶端&#xff0c;而Spring作為后端服務器端框架。 該示例Web應用程序將提供對數據庫執行CRUD&#xff08;創建檢索更新刪除&#xff09;操作的功能。 對于數據訪問層…

洛谷P1014 [NOIP1999 普及組] Cantor 表

現代數學的著名證明之一是 Georg Cantor 證明了有理數是可枚舉的。他是用下面這一張表來證明這一命題的&#xff1a; 代碼 import java.util.*; public class Main{public static void main(String[] args){//int x1 0;int i 0;Scanner sc new Scanner(System.in);int n s…

3522: [Poi2014]Hotel( 樹形dp )

枚舉中點x( 即選出的三個點 a , b , c 滿足 dist( x , a ) dist( x , b ) dist( x , c ) ) , 然后以 x 為 root 做 dfs , 顯然兩個位于 x 的同一顆子樹內的點是不可能被同時選到的 . 我們對 x 的每一顆子樹進行 dfs , 記錄下當前子樹中的點到 x 距離為 d ( 1 < d < n )…

第一沖刺階段工作總結02

1.昨天&#xff1a; 實驗簡單的安卓程序&#xff0c;開始具體的設計軟件界面。 2.今天&#xff1a; 繼續設計軟件頁面&#xff0c;由于安卓虛擬機過于遲緩&#xff0c;配置真機&#xff0c;學習如何在真機上運行程序。 3.遇到的困難&#xff1a; 真機配置不知道怎樣配置&#x…

JBoss 4.2.x Spring 3 JPA Hibernate教程第2部分

我們將繼續有關Spring 3 &#xff0c; Hibernate &#xff0c; JPA和JBoss 4.2.x – 4.3集成的教程 。 最后一步是創建一個Spring服務&#xff0c;以向最終用戶公開功能。 我們必須創建一個接口類和相關的實現類。 首先是接口類&#xff1a; package com.mycomp.myproject.se…

洛谷P1035 [NOIP2002 普及組] 級數求和

代碼 import java.util.Scanner;public class Main {public static void main(String args[]){Scanner sc new Scanner(System.in);int k sc.nextInt();int n 0;double Sn 0;while(Sn<k){n;Sn Sn 1.0/n;}System.out.println(n);} }這樣寫while循環體這需要每次加上1/…

『Luogu OJ』『C++』Level 1-1

關卡1-1&#xff0c;3道題 洛谷的第一個任務 任務說明&#xff1a;勇敢的邁出第一步&#xff0c;了解下語言和洛谷。跟著書本和老師走&#xff0c;不會難的。 要完成這個任務&#xff0c;請將以下的題目都AC掉&#xff08;即通過這道題目&#xff09;&#xff1a; 1.AB Problem…

Java中的Google ClientLogin實用程序

Google API的身份驗證和授權是當今需要與Google服務集成和信息交換的應用程序中的常見功能。 盡管大多數Google身份驗證過程是針對Web應用程序量身定制的&#xff0c;但它也可用于桌面和已安裝的應用程序。 對于桌面應用程序&#xff0c;Google建議使用稱為ClientLogin的身份驗…

九度OJ1486 /POJ 1029/2012北京大學研究生復試上機

wa到死&#xff01;wa到死&#xff01;這是一個看著簡單&#xff0c;坑及其多的題&#xff01; 坑一&#xff1a;POJ上是單組輸入&#xff0c;九度上是多組輸入&#xff0c;媽蛋要是研究生復試遇到這種大坑肯定死掉啊&#xff01;而且對于codeforces比較習慣的 同學肯定會覺得巨…

P1046 [NOIP2005 普及組] 陶陶摘蘋果

題目描述 陶陶家的院子里有一棵蘋果樹&#xff0c;每到秋天樹上就會結出 1010 個蘋果。蘋果成熟的時候&#xff0c;陶陶就會跑去摘蘋果。陶陶有個 3030 厘米高的板凳&#xff0c;當她不能直接用手摘到蘋果的時候&#xff0c;就會踩到板凳上再試試。 現在已知 1010 個蘋果到地面…

新手不了解Xcode和mac系統可能犯得錯誤和我的建議

我是學iOS剛入門的新手&#xff0c;本人裝的時黑蘋果&#xff0c;我是喜歡完美的人&#xff0c;但黑蘋果又是不完美的系統&#xff0c;比如關不了機啊&#xff0c;和顯卡驅動不了啊&#xff0c;當自己的電腦出現白屏和卡頓的時候氣的沒脾氣。我是一個新手。開始學的時java但我喜…

改善Java應用程序性能的快速技巧

曾經遇到過性能問題嗎&#xff1f; 我也是。 如果我的經理再喊一次“ faaaaster”&#xff0c;我一生都會有聽力障礙。 順便說一句&#xff0c;我能聽到所有聲音中的德語發音嗎&#xff1f; ;-) 您可以相信仍然有人無知地在談論垃圾收集器&#xff08;得到它嗎&#xff1f;&…

P1047 [NOIP2005 普及組] 校門外的樹

某校大門外長度為 ll 的馬路上有一排樹&#xff0c;每兩棵相鄰的樹之間的間隔都是 11 米。我們可以把馬路看成一個數軸&#xff0c;馬路的一端在數軸 00 的位置&#xff0c;另一端在 ll 的位置&#xff1b;數軸上的每個整數點&#xff0c;即 0,1,2,\dots,l0,1,2,…,l&#xff0…

團隊開發——個人工作總結04

昨天對要用到的SQL語句進行了研究&#xff0c;分別得到了以下結果&#xff1a; 1.這段語句是為用戶登錄服務的&#xff0c;通過JSP的到的用戶名username和密碼passdword作為條件查詢數據庫&#xff0c;如果有查詢結果&#xff0c;則返回true select * from [login] where usern…

Nginx的幾種常見的幾種啟動方式

1.默認方式啟動 直接執行Nginx的二進制文件即可 /usr/local/nginx/sbin/nginx 這時默認讀取配置文件&#xff0c;配置文件目錄 /usr/local/nginx/conf/nginx.conf 2.指定配置文件的啟動方式 /usr/local/nginx/sbin/nginx -c /tmp/nginx.conf轉載于:https://www.cnblogs.com/Leo…

yii2閱讀隨筆14

繼續來看Event.php /*** Triggers a class-level event.* 觸發類級別事件。* This method will cause invocation of event handlers that are attached to the named event* for the specified class and all its parent classes.* 觸發某個類或者對象的某個事件* param strin…

P1059 [NOIP2006 普及組] 明明的隨機數

題目描述 明明想在學校中請一些同學一起做一項問卷調查&#xff0c;為了實驗的客觀性&#xff0c;他先用計算機生成了N個1到1000之間的隨機整數(N≤100)&#xff0c;對于其中重復的數字&#xff0c;只保留一個&#xff0c;把其余相同的數去掉&#xff0c;不同的數對應著不同的學…

基本的EJB參考,注入和查找

在本系列的第一部分中 &#xff0c;我們介紹了Enterprise JavaBeans v。3.0規范提供的機制&#xff0c;用于定義EJB組件&#xff0c;聲明對EJB的引用并通過依賴項注入或程序化JNDI查找將它們連接起來。 在此博客文章中&#xff0c;我們將研究一些基本示例以了解如何使用EJB API…

ViewPager使用筆記

1.ViewPager.setCurrentItem(position)&#xff0c;即使已設置動畫&#xff0c;但是沒有動畫效果 原因&#xff1a;因為ViewPager滑動之前的時間間隔太短&#xff0c;可以通過反射&#xff0c;去修改ViewPager自動滑動時間&#xff0c;代碼實現如下 1 public class ViewPagerSc…

IOS開發之Swift學習筆記

1.因為存儲屬性要求初始化&#xff0c;我們可以使用lazy修飾符來延遲初始化。轉載于:https://www.cnblogs.com/luntai/p/5430223.html