欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談編碼,解碼,亂碼的問題

 更新時(shí)間:2016年12月30日 10:38:47   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\談編碼,解碼,亂碼的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

在開發(fā)的過程中,我們不可避免的會(huì)遇到各種各樣的編碼,解碼,或者亂碼問題,很多時(shí)候,我們可以正常的解決問題,但是說實(shí)在的,我們有可能并不清楚問題到底是怎么被解決的,秉承知其然,更要知其所以然的理念,經(jīng)過一番研究,就有了下面的這篇文章,鑒于本人功力尚淺,有錯(cuò)誤請(qǐng)給予糾正 :-)

編碼解碼核心

簡(jiǎn)單的來說,編碼是從一個(gè)字符,比如‘郭',到一段二進(jìn)制碼流的過程。解碼是從一段二進(jìn)制碼流到一個(gè)字符的過程。

但是,就計(jì)算機(jī)工作原理而言,這其中涉及到了三個(gè)對(duì)象。

•字符 (我們?cè)诟鞣N終端上面看得到的顯示結(jié)果)

•內(nèi)碼 (對(duì)應(yīng)顯示的字符的計(jì)算機(jī)存儲(chǔ)數(shù)據(jù))

•字符集 (內(nèi)碼在內(nèi)存中的具體實(shí)現(xiàn))

這三者之間的配合如下圖。

字符

對(duì)于字符而言,是我們程序員而言想必是最熟悉的了吧。什么Abs_=+/.80,都是我們所熟悉使用的字符。雖然我們表面上看到的是一個(gè)個(gè)的字符,但是在計(jì)算機(jī)而言,其真正識(shí)別和處理的不過是對(duì)應(yīng)于顯示的字符的一個(gè)個(gè)的內(nèi)碼。

內(nèi)碼

內(nèi)碼是漢字在計(jì)算機(jī)內(nèi)部存儲(chǔ),處理和傳輸用的信息編碼。它必須與ASCII碼兼容但又不能沖突。

也許你會(huì)想,ASCII碼又是什么? 對(duì)此,百度百科是這樣解釋的:

ASCII(American Standard Code for Information Interchange,美國(guó)信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),并等同于國(guó)際標(biāo)準(zhǔn)ISO/IEC 646。

從這里我們不禁會(huì)想,既然是單字節(jié)編碼,那么漢字這種多字節(jié)表示的信息又是怎么被計(jì)算機(jī)識(shí)別和處理的呢?

國(guó)標(biāo)碼規(guī)定:一個(gè)漢字用兩個(gè)字節(jié)來表示,每個(gè)字節(jié)只用前七位,最高位均未作定義。但我們要注意,國(guó)標(biāo)碼不同于ASCII碼,并非漢字在計(jì)算機(jī)內(nèi)的真正表示代碼,它僅僅是一種編碼方案,計(jì)算機(jī)內(nèi)部漢字的代碼叫做漢字機(jī)內(nèi)碼,簡(jiǎn)稱漢字內(nèi)碼。

所以,這也是國(guó)人在平時(shí)開發(fā)過程中經(jīng)常會(huì)遇到的 亂碼問題的根源。

字符集

字符集作為內(nèi)碼在內(nèi)存中的具體實(shí)現(xiàn),肩負(fù)著很大的責(zé)任。

•ascii不僅僅指英文對(duì)應(yīng)的內(nèi)碼,還包括它的具體實(shí)現(xiàn),也就是它的字符集。它是用一個(gè)字節(jié)存儲(chǔ)每個(gè)內(nèi)碼的。

•unicode是所有文字(包括英文,中文,日文等)所對(duì)應(yīng)的內(nèi)碼的集合。

unicode的實(shí)現(xiàn)方式比較多樣,常用的有UTF-8,GBK,GB18030。

•其中,UTF-8是一種不定長(zhǎng)的內(nèi)碼實(shí)現(xiàn)方式。

GB18030兼容GBK,GBK兼容GB2312。

嚴(yán)格點(diǎn)來講,我們所謂的編碼解碼問題:編碼指內(nèi)碼編碼成字符集;解碼指字符集解碼為內(nèi)碼

-----------------------------------------------

系統(tǒng)編碼

眾所周知,在不同的操作系統(tǒng)上,支持的編碼也是不太一致的。所以我們?cè)诳缙脚_(tái)操作的時(shí)候,需要重點(diǎn)考慮的問題就包括系統(tǒng)編碼問題。

windows

在Windows上查詢當(dāng)前系統(tǒng)的活動(dòng)代碼頁,就可以知道當(dāng)前系統(tǒng)使用的編碼。

調(diào)出命令行之后輸入: chcp 即可。

基本上國(guó)人的電腦上會(huì)顯示936

936 代表GBK 擴(kuò)展的EUC-CN 編碼( GB 2312-80編碼,包含 6763 個(gè)漢字)到Unicode (GB13000.1-93)中定義的20902個(gè)漢字,即中國(guó)大陸使用的是簡(jiǎn)體中文zh_CN.。

Linux

在Linux操作系統(tǒng)上查看系統(tǒng)編碼更是方便。

locale是最核心的一個(gè)變量。它包括12個(gè)基本屬性。這12個(gè)基本屬性構(gòu)成某個(gè)地區(qū)的語言習(xí)慣,日期,貨幣,單位等文化因素。LC_ALL是強(qiáng)制修改locale信息的命令。LANG是locale的默認(rèn)設(shè)置命令。因此,當(dāng)LC_ALL強(qiáng)制locale信息以后,LANG的設(shè)置也就失效了。

當(dāng)然了,我們可以根據(jù)自己的喜好,來為自己的linux計(jì)算機(jī)分配系統(tǒng)編碼。

----------------------------------------------------

Python中的編碼問題

一般而言,談到程序編碼問題,首屈一指的就是Python語言中的編碼了。尤其是Unicode字符集的使用,更是讓人摸不著頭腦。不過,現(xiàn)在不用擔(dān)心了,待會(huì)我會(huì)出絕招滴。

系統(tǒng)編碼

經(jīng)過了剛才的知識(shí)的鋪墊,大家肯定對(duì)此也有了一定的感悟了。Python中的系統(tǒng)編碼充當(dāng)了一個(gè)橋梁的作用。其通常也是寫源碼的編輯器的編碼方式。它代表源碼文件內(nèi)的所有內(nèi)容都是根據(jù)詞方式編碼成二進(jìn)制碼流,存入到磁盤中的。

系統(tǒng)編碼可以通過locale命令查看(LINUX)。

說白咯,就是操作系統(tǒng)是怎么存儲(chǔ)我們的Python源程序的。

Python編碼

這是一個(gè)比較新的概念,也是Python編碼問題的根源。那就是指python內(nèi)設(shè)置的解碼方式。如果不設(shè)定的話,python默認(rèn)是ascii解碼。所以我們不難理解為什么有漢字的時(shí)候很容易出現(xiàn)亂碼的情況了吧。

為了解決Python默認(rèn)編碼不支持漢字的窘境。我們需要手動(dòng)的設(shè)置,讓其識(shí)別咱們可愛的博大精深的漢字。一般有如下三種方式。

方式一

只能Python識(shí)別

在源碼文件開頭(一定要是第一行):#coding=UTF-8,源碼文件的設(shè)置解碼方式為UTF-8

方式二

可以被其他的語言識(shí)別

在源碼文件開頭(一定是第一行):#--coding:UTF-8--,源碼文件的設(shè)置解碼方式是UTF-8

方式三

我經(jīng)常使用的方式是方式一加方式三

import sys
reload(sys)
sys.setdefaultencoding('UTF-8')

文件編碼

對(duì)于文件編碼,大體意思就是系統(tǒng)為我們即將存儲(chǔ)的文件而進(jìn)行的編碼操作。

實(shí)例一

系統(tǒng)編碼:locale:gbk
python源文件test.py
#coding='UTF-8'
s='郭'
print s

在test.py被保存的那一刻,系統(tǒng)會(huì)以gbk的方式將數(shù)據(jù)存儲(chǔ)到本地硬盤上,而在下次我們運(yùn)行這段代碼的時(shí)候,Python編碼會(huì)按照源文件開頭指定的utf-8編碼來解碼并運(yùn)行,所以遇到'郭'的時(shí)候,由于碼制的不同,出現(xiàn)亂碼或者出現(xiàn)錯(cuò)誤就不難理解了。

實(shí)例二

系統(tǒng)編碼:locale:gbk
test.py
#coding='gbk'
s='郭'
ss=s.encode('UTF-8')

這個(gè)時(shí)候,系統(tǒng)編碼仍然會(huì)以gbk的變啊買房時(shí)對(duì)源文件進(jìn)行編碼處理,但是在遇到ss=s.encode('UTF-8')的時(shí)候,會(huì)先以Python編碼指定的方式將對(duì)應(yīng)的字符串(二進(jìn)制碼流)編碼,再按照系統(tǒng)編碼對(duì)其進(jìn)一步的編碼處理。

而在下次加載的時(shí)候,程序會(huì)被以對(duì)二進(jìn)制碼流,按照解碼的編碼處理原則處理。也就是說Python解釋到ss=s.encode('UTF-8')行的時(shí)候,會(huì)對(duì)相應(yīng)的二進(jìn)制碼流以u(píng)tf-8的方式解碼,這樣就能很好的解決掉字符集不匹配的問題了。

二進(jìn)制碼流(python中,所有字符串都表示的是相應(yīng)的二進(jìn)制碼流,所有的unicode都表示的是相應(yīng)的內(nèi)碼)

Python中字符串和Unicode的區(qū)別

字符串表示的是編碼后的二進(jìn)制碼流,unicode表示的是內(nèi)碼。所以,為了避免解碼錯(cuò)誤的出現(xiàn),最好使用unicode表示

unicode的定義,使用

•s=u'郭':定義unicode字符串s。s表示的是哈的unicode內(nèi)碼

•ss=unicode(s,'gbk'):對(duì)字符串s按照gbk方式解碼,ss表示解碼后的內(nèi)碼

•import codecs

f=codecs.open(filename,'r','gbk‘)
s=f.read()

按照gbk方式讀取filename,讀取后的內(nèi)容轉(zhuǎn)變成unicode內(nèi)碼存在變量s中。

了解了以上編碼解碼的底層原理之后,基本上就可以應(yīng)對(duì)相關(guān)的亂碼問題了。

-----------------------------------------------------

PHP中的編碼

在PHP中我們也經(jīng)常會(huì)遇到頁面出現(xiàn)亂碼的情況,有了上面的知識(shí)基礎(chǔ),我們?cè)龠^來看PHP中的亂碼問題,就會(huì)迎刃而解了。當(dāng)然了,今天主要是來講一講如何解決PHP中文亂碼問題。

header

header("Content-Type:text/html;charset=utf-8");

加上頭信息的作用就是告訴瀏覽器,以XX方式來解碼?;旧隙圆粫?huì)有太大的問題,但是前提是雙方的系統(tǒng)編碼能保持一致,否則也會(huì)出現(xiàn)由于系統(tǒng)編碼不同而引起的亂碼問題,對(duì)照Python的案例,我們也很容易可以理解。

set names XX

mysql_query("set names UTF-8");

這個(gè)是對(duì)數(shù)據(jù)庫數(shù)據(jù)亂碼的很好的解決辦法。說白了這就是所謂的“系統(tǒng)編碼不同而引起的亂碼問題的一類”。就拿MySQL數(shù)據(jù)庫而言,我們是以客戶端的形式來訪問的數(shù)據(jù),如果MySQL客戶端的編碼為gbk,而我們的瀏覽器解碼使用的是UTF-8,請(qǐng)問怎么可能不會(huì)亂碼呢?

只要保持雙方的編碼,解碼方式一致,亂碼問題,不攻自破。

-------------------------------------------------------

數(shù)據(jù)庫中的編碼

通過剛才的學(xué)習(xí),類比系統(tǒng)編碼和文件編碼。我們經(jīng)常遇到的數(shù)據(jù)庫信息存取出現(xiàn)亂碼問題就可以很容易的解決了。

修改字符集設(shè)置即可。但是這不是一個(gè)好習(xí)慣,比較好的做法是修改讀取出來的數(shù)據(jù)的編碼。

以MySQL為例。

可以先輸入查詢語句SHOW VARIABLES LIKE ‘character_set_%';,查看所有的編碼是否是UTF-8.

如果不是可以使用Server Instance Config 把默認(rèn)的字符集設(shè)置為utf-8或者修改/MySQL/MySQL Server 5.0/my.ini中的default-character-set=gbk

character-set-server=gbk; 

然后重新啟動(dòng)mysql的服務(wù)就行了

JSP亂碼

在開發(fā)JavaWeb的時(shí)候,遇到JSP亂碼的情況有很多,下面著重的來探討一下解決方案呢。

JSP頁面本身

每個(gè)頁面上加上 這樣在jsp頁面里,點(diǎn)右鍵,查看編碼方式則為UTF-8.

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>

也可以把設(shè)置myEclipse中默認(rèn)的contentTyepe。步驟是:windows->preferences->Generl->ContentType.然后設(shè)置成UTF-8.一定要update~~

在JSP頁面頭部加入下面這句話,告訴瀏覽器應(yīng)該調(diào)用UTF-8的字符集。

或者使用HTML標(biāo)簽來聲明

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 

數(shù)據(jù)庫連接語句

•設(shè)置characterencoding為UTF-8 如jdbc.mysql.url=jdbc:mysql://localhost:3306/db?useUnicode=true&amp;characterEncoding=UTF8

•如果使用Hibernate,那就把所有的配置文件頭部的編碼格式改成UTF-8。

Tomcat方面

為了保證get/post數(shù)據(jù)都采用相同的UTF8編碼,我們?cè)趕erver.xml中進(jìn)行了如下設(shè)置:

<Connector port="8080" protocol="HTTP/1.1" 
 connectionTimeout="20000"redirectPort="8443" URIEncoding="UTF-8" />

過濾器Filter

有些時(shí)候,使用過濾器可以一勞永逸的解決亂碼問題,原理就是強(qiáng)化了通信雙方的編碼一致性。

//在doFilter方法中添加這樣的代碼
HttpServletRequest request = (HttpServletRequest )req;
HttpServletResponse response = (HttpServletResponse )resp;
request.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type:text/htmlcharset=UTF-8");
response.setCharacterEncoding("UTF-8");


//放行
chain.doFilter(request,response);

總結(jié)

回顧一下,解決亂碼問題的核心就是保證編碼與解碼工作的一致性。無論是系統(tǒng)編碼還是文件編碼,保證編碼工作和解碼工作的反向一致性,基本上就不會(huì)出現(xiàn)亂碼問題。

如果你發(fā)現(xiàn)文章中有不恰當(dāng)?shù)牡胤?,歡迎批評(píng)指正。

以上這篇淺談編碼,解碼,亂碼的問題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Python核心對(duì)象類型字符串

    詳解Python核心對(duì)象類型字符串

    本篇文章通過理論知識(shí)點(diǎn)給大家講述了Python核心對(duì)象類型字符串的相關(guān)知識(shí)內(nèi)容,對(duì)此有興趣的一起學(xué)習(xí)下。
    2018-02-02
  • python使用post提交數(shù)據(jù)到遠(yuǎn)程url的方法

    python使用post提交數(shù)據(jù)到遠(yuǎn)程url的方法

    這篇文章主要介紹了python使用post提交數(shù)據(jù)到遠(yuǎn)程url的方法,涉及Python使用post傳遞數(shù)據(jù)的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • Python常用正則表達(dá)式符號(hào)淺析

    Python常用正則表達(dá)式符號(hào)淺析

    這篇文章主要介紹了Python常用正則表達(dá)式符號(hào),非常實(shí)用,需要的朋友可以參考下
    2014-08-08
  • 淺談Python中re.match()和re.search()的使用及區(qū)別

    淺談Python中re.match()和re.search()的使用及區(qū)別

    這篇文章主要介紹了淺談Python中re.match()和re.search()的使用及區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python實(shí)現(xiàn)書法碑帖圖片分割

    python實(shí)現(xiàn)書法碑帖圖片分割

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)書法碑帖圖片分割,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Python實(shí)現(xiàn)隨機(jī)取一個(gè)矩陣數(shù)組的某幾行

    Python實(shí)現(xiàn)隨機(jī)取一個(gè)矩陣數(shù)組的某幾行

    今天小編就為大家分享一篇Python實(shí)現(xiàn)隨機(jī)取一個(gè)矩陣數(shù)組的某幾行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python寫了個(gè)疫情信息快速查看工具實(shí)例代碼

    Python寫了個(gè)疫情信息快速查看工具實(shí)例代碼

    本次使用PyQt5開發(fā)了一款疫情信息快速查看工具,實(shí)現(xiàn)了多個(gè)數(shù)據(jù)源的查看,代碼量不大,功能相當(dāng)于瀏覽器,只是限定了一些特定網(wǎng)址,這篇文章主要介紹了Python寫了個(gè)疫情信息快速查看工具,需要的朋友可以參考下
    2022-11-11
  • python 同時(shí)運(yùn)行多個(gè)程序的實(shí)例

    python 同時(shí)運(yùn)行多個(gè)程序的實(shí)例

    今天小編就為大家分享一篇python 同時(shí)運(yùn)行多個(gè)程序的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python爬蟲進(jìn)階之Beautiful Soup庫詳解

    Python爬蟲進(jìn)階之Beautiful Soup庫詳解

    這篇文章主要介紹了Python爬蟲進(jìn)階之Beautiful Soup庫詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python爬蟲的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 使用Python保護(hù)或加密Excel文件的7種方法

    使用Python保護(hù)或加密Excel文件的7種方法

    Excel文件通常包含敏感信息,如財(cái)務(wù)記錄、客戶數(shù)據(jù)或?qū)S泄?保護(hù)和加密這些文件對(duì)于防止未經(jīng)授權(quán)的訪問和維護(hù)機(jī)密性至關(guān)重要,在本文中,我們將探討如何使用Python自動(dòng)化Excel文件的安全保護(hù)和加密過程,確保數(shù)據(jù)的安全性,需要的朋友可以參考下
    2025-02-02

最新評(píng)論