999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

應用開發中的中文亂碼原因及其解決方案

2012-09-21 08:31:52王天寶
成都信息工程大學學報 2012年5期
關鍵詞:信息

閆 靜, 王天寶, 羅 浩

(成都信息工程學院,四川成都 610225)

0 引言

程序員在開發Web應用的時候經常會遇到中文亂碼問題,雖然知道是編碼問題,改變編碼就可以解決中文亂碼問題,但是很多時候并不清楚為什么要這樣做,這一直困擾著許多開發者。所以了解字符編碼,并搞清楚中文亂碼產生的原因,是解決中文亂碼的最有效方法。

1 字符編碼標準

計算機中的信息包括數據信息和控制信息,數據信息又可分為數值和非數值信息。非數值信息和控制信息包括了字母、各種控制符號、圖形符號等,它們都以二進制編碼方式存入計算機處理,這種對字母和符號進行編碼的二進制代碼稱為字符代碼。計算機存放時不是存儲字符本身,而是存儲字符相對應的二進制表示,即每個字符在字符編碼集中的編號[1]。從字符編碼的發展歷程分析,大致可以分為3個階段:ASCII編碼、ANSI編碼、Unicode編碼。

1.1 ASCII編碼

美國信息互換標準代碼(American Standard Code for Information Interchange,ASCII)是基于拉丁字母的一套電腦編碼系統。主要用于顯示現代英語和其他西歐語言。是現今最通用的單字節編碼系統,并等同于國際標準ISO/IEC 646。ASCII碼使用指定的7位或8位二進制數組合表示128或256種可能的字符。標準ASCII碼也叫基礎ASCII碼,使用7位二進制數表示所有的大寫和小寫字母,數字0到9、標點符號,以及在美式英語中使用的特殊控制字符[2-3]。在標準ASCII中,其最高位(b7)用作奇偶校驗位。所謂奇偶校驗,是指在代碼傳送過程中用來檢驗是否出現錯誤的一種方法,一般分奇校驗和偶校驗兩種。奇校驗規定:正確的代碼一個字節中1的個數必須是奇數,若非奇數,則在最高位b7添1;偶校驗規定:正確的代碼一個字節中1的個數必須是偶數,若非偶數,則在最高位b7添1。后128個稱為擴展ASCII碼,目前許多基于x86的系統都支持使用擴展(或“高”)ASCII。擴展ASCII碼允許將每個字符的第8位用于確定附加的128個特殊符號字符、外來語字母和圖形符號。ASCII碼在內存中存儲字符串的方式如表1所示[4]。

如英文字符串“GOOD”在內存中的存儲方式為:

表1 ASCII碼在內存中存儲字符串的方式

1.2 ANSI編碼

為使計算機支持更多語言,通常使用0x80~0xFF范圍的2個字節表示1個字符。比如:漢字‘中'在中文操作系統中,使用[0xD6,0xD0]這兩個字節存儲。不同的國家和地區制定了不同的標準,由此產生了GB2312,BIG5,JIS等各自的編碼標準。使用2個字節代表一個字符的各種漢字延伸編碼方式,稱為ANSI編碼。同時為了保持與ASCII碼的兼容,約定第一個字節的最高位為0時(<128),其編碼表示與ASCII碼相同,而最高位為1時(>128),其與后面的一個字節共同表示一個擴展語言字符。按照這種定義方式不同國家和地區制定了不同的標準,由此產生了簡體中文GB2312、GBK、繁體中文BIG5、日文SJIS等字符集。在簡體中文系統下,ANSI編碼代表GB2312編碼,在日文操作系統下,ANSI編碼代表JIS編碼。

不同ANSI編碼之間互不兼容,當信息在國際間交流時,無法將屬于兩種語言的文字,存儲在同一段ANSI編碼的文本中。這些從ASCII擴展的編碼方式,英文部分都是兼容的,但擴展部分的編碼由于采用不同的方式制定,它們是不兼容的,雖然很多字在3種體系中寫法一致(例如“中文”這兩個字),但在相應字符集中的坐標不一致,所以GB2312編碼的字符用BIG5看就全是亂碼了。另外在瀏覽其他非英語國家的頁面時(比如包含有德語的人名時)經常出現奇怪的漢字,是由擴展位的編碼沖突造成。

對于中文來說常用的是gb2312編碼,它是中華人民共和國國家漢字信息交換用編碼,全稱《信息交換用漢字編碼字符集——基本集》,由國家標準總局發布,1981年5月1日實施,通行于大陸。新加坡等地也使用此編碼。它是計算機可以識別的編碼,適用于漢字處理、漢字通信等系統之間的信息交換。基本集共收入漢字6763個和非漢字圖形字符682個。整個字符集分成94個區,每區有94個位[5]。每個區位上只有一個字符,因此可用所在的區和位來對漢字進行編碼,稱為區位碼。gb2312編碼每個漢字及符號以兩個字節表示。第一個字節稱為“高位字節”(也稱“區字節)”,第二個字節稱為“低位字節”(也稱“位字節”)。“高位字節”使用了0xA1~0xF7(把01~87區的區號加上0xA0),“低位字節”使用了0xA1~0xFE(把01~94加上0xA0)。由于一級漢字從16區起始,漢字區的“高位字節”的范圍是0xB0~0xF7,“低位字節”的范圍是0xA1~0xFE,占用的碼位是72*94=6768。其中有5個空位是D7FA~D7FE。例如“啊”字在大多數程序中,會以兩個字節0xB0(第一個字節)0xA1(第二個字節)儲存。

1.3 Unicode編碼

為了使國際間信息交流更加方便,Unicode字符集編碼誕生。Unicode是Universal Multiple-Octet Coded Character Set的縮寫,中文含義是“通用多八位編碼字符集”。是由一個名為Unicode學術學會(Unicode Consortium)的機構制訂的字符編碼系統,Unicode目標是將世界上絕大多數國家和地區的文字、符號都編入其字符集,為每種語言中的每個字符設定了統一并且唯一的二進制編碼(位模式),以滿足跨語言、跨平臺進行文本轉換、處理的要求,以達到支持現今世界各種不同語言的書面文本的交換、處理及顯示的目的[6],使世界范圍人們通過計算機進行信息交換時達到暢通自如而無障礙。即Unicode編碼就是先將世界上存在的絕大多數常用字符納入Unicode字符集,然后進行統一排號。而每個Unicode字符的編碼(位模式)就是該字符在Unicode字符表中的序號,所以與上面提到的ANSI編碼不同的是,一個Unicode字符的編碼用一個整數表示,而這個整數的長度通常>=2個字節。事實證明,對可以用ASCII表示的字符使用Unicode并不高效,因為Unicode比ASCII占用大一倍的空間,而對ASCII來說高字節的0對其毫無用處。為了解決這個問題,就出現了一些中間格式的字符集,被稱為通用轉換格式,即UTF(Universal Transformation Format)。目前存在的UTF格式有:UTF-7,UTF-7.5,UTF-8,UTF-16,以及UTF-32。目前比較常見的UTF方案有3種:

UTF-16:其本身就是標準的Unicode編碼方案,又稱為UCS-2,固定使用16 bits(兩個字節)整數表示一個字符。

UTF-32:又稱為UCS-4,固定使用32 bits(四個字節)整數表示一個字符。

UTF-8:最廣泛使用的UTF方案,UTF-8使用可變長度字節來儲存Unicode字符,例如ASCII字母繼續使用1字節儲存,重音文字、希臘字母或西里爾字母等使用2字節來儲存,而常用的漢字就要使用3字節。輔助平面字符則使用4字節。UTF-8更便于在使用Unicode的系統與現存的單字節的系統進行數據傳輸和交換。與前兩個方案不同:UTF-8以字節為編碼單元,沒有字節序的問題。

在Unicode出現之前,所有的字符集都是和具體編碼方案綁定在一起,都是直接將字符和最終字節流綁定,例如ASCII編碼系統規定使用7比特來編碼ASCII字符集;GB2312以及GBK字符集,限定了使用最多2個字節編碼所有字符,并且規定了字節序。這樣的編碼系統通常用簡單的查表,也就是通過代碼頁就可以直接將字符映射為存儲設備上的字節流了。這種方式的缺點在于,字符和字節流間耦合太緊密了,從而限定字符集的擴展能力。因此Unicode在設計上考慮到這一點,將字符集和字符編碼方案分離開。也就是說,雖然每個字符在Unicode字符集中都能找到唯一確定的編號(字符碼,又稱Unicode碼),但是決定最終字節流的卻是具體的字符編碼[7]。例如同樣是對Unicode字符“A”進行編碼,UTF-8字符編碼得到的字節流是0x41,而UTF-16(大端模式)得到的是0x000x41[8]。

通過前面的介紹,了解了計算機中編碼的大致分類。在實際開發過程中,沒有必要去深究每一種編碼具體把一個字符編碼成哪幾個字節,只需要知道所謂“編碼”就是把字符轉換為若干個字節的數字就可以了。

2 中文亂碼產生的原因

中文字符亂碼在Web應用開發中一直困擾著許多開發者。出現亂碼的原因一般是字符編碼標準不統一造成[5]。標準ASCII碼也叫基礎ASCII碼,使用7位二進制數表示所有的大寫和小寫字母,數字0到9、標點符號,以及在美式英語中使用的特殊控制字符。各國通過ANSI編碼擴展了適合自己國家的字符編碼標準,ANSI編碼使用2個字節表示一個字符,各種ANSI編碼是不兼容的。Unicode字符的編碼用的是一個整數表示,而這個整數的長度通常>=2個字節。因此計算機中存儲的同一組編碼采用不同的字符編碼解析就會出現不同的結果,就會出現亂碼。通過以上內容知道產生字符亂碼最主要的原因就是在開發的各個環節或階段中使用的字符集不一致或者前后不兼容,從而使字符在被調用和顯示過程中不能被下一階段正確的識別,所以出現了亂碼[4]。

3 解決方法

對于Web應用解決亂碼一般從以下3方面入手,第一,首先檢查網頁文件本身存儲時使用的字符編碼和網頁聲明的字符編碼是否一致,如果不一致就會導致亂碼,那么把它改為一致就能夠解決亂碼問題了[9]。如果文件比較少,可以采用文本文檔的另存為改變文件本身存儲時使用的字符編碼,在文件比較多的情況下,可以使用轉換工具批量轉換文件本身存儲時使用的字符編碼。第二,檢查網頁內是否使用META HTTP-EQUIV標簽指定了字符編碼,如果沒有為其指定合適字符編碼即可。因為如果不為其指定字符編碼,那么它會使用默認的字符編碼,此時若和文件存儲時使用的字符編碼不一致就會導致亂碼。第三,檢查服務器返回的響應頭Content-Type是否指明字符編碼 ,如果沒有為其指明正確匹配的字符編碼。

早期字符編碼、字符集和代碼頁等概念都是表達同一個意思。例如GB2312字符集、GB2312編碼,936代碼頁,實際上表達的是同一個意思。但是對于Unicode則不同,Unicode字符集只是定義了字符的集合和唯一編號,Unicode編碼,則是對UTF-8、UTF-16等具體編碼方案的統稱而已,并不是具體的編碼方案。所以當需要用到字符編碼的時候,可以寫gb2312,utf-8,utf-16等,但請不要寫Unicode例如在網頁的meta標簽里寫charset=Unicode[7]。

當程序使用特定字符編碼解析字節流的時候,一旦遇到無法解析的字節流時,就會用□替代。因此,一旦最終解析得到的文本包含這樣的字符,而又無法得到原始字節流的時候,說明正確的信息已經徹底丟失了,嘗試任何字符編碼都無法從這樣的字符文本中還原出正確的信息[7]。此時要重新輸入中文信息,并使用正確的編碼才可以正確顯示。

4 結束語

介紹了字符編碼標準,分析了中文亂碼產生的主要原因,提出了解決辦法。對Web應用開發中瀏覽器端的相關中文亂碼問題分析仍然還是很有限的,另外沒有介紹服務器端中文亂碼問題。

[1] 張峰.Java Web應用中編碼問題的研究與解決[J].計算機與網絡,2008,(28).

[2] 楊玉婷.Web應用程序開發中的中文亂碼問題討論[J].重慶三峽學院學報,2011,(3):60-63.

[3] 程曉錦.應用程序開發中的亂碼問題[J].北京印刷學院學報.2011,(8):60-62.

[4] 高菲.Web開發中亂碼問題的開發與解決[J].科技管理研究,2010,(8):124-125.

[5] 陳小瀚.中文編碼原理及其亂碼問題的探討[J].計算機與信息技術.2007,(24).

[6] 蘇蘊.關于Java Web技術開發中中文亂碼問題的深入探討[J].福建電腦,2010,(8):142-143.

[7] 關于字符編碼你所需要知道的[EB/OL].http://www.cnblogs.com/KevinYang/archive/2010/06/18/1760597.html

[8] 劉財興,孫微微,肖德琴.Java編程技術中漢字“亂碼”問題的分析及解決[J].廣東交通職業技術學院學報,2002,(6):56-61.

[9] 楊金花.JSP技術中文亂碼的原因及解決辦法[J].電子設計工程,2011,(1):25-27.

猜你喜歡
信息
訂閱信息
中華手工(2017年2期)2017-06-06 23:00:31
展會信息
中外會展(2014年4期)2014-11-27 07:46:46
信息超市
大眾創業(2009年10期)2009-10-08 04:52:00
展會信息
展會信息
展會信息
展會信息
展會信息
信息
建筑創作(2001年3期)2001-08-22 18:48:14
健康信息
祝您健康(1987年3期)1987-12-30 09:52:32
主站蜘蛛池模板: 亚洲午夜18| 综合久久五月天| 99国产精品免费观看视频| 亚洲国产清纯| 热思思久久免费视频| 热九九精品| 亚洲欧洲日韩久久狠狠爱| 国产永久在线观看| 午夜精品久久久久久久无码软件| 欧洲极品无码一区二区三区| 国产成人亚洲无码淙合青草| 中文字幕欧美成人免费| 伊人色天堂| 国产爽妇精品| 日本人妻一区二区三区不卡影院| 亚洲V日韩V无码一区二区| 亚洲精品在线观看91| 久久中文字幕av不卡一区二区| 国产爽妇精品| 色欲国产一区二区日韩欧美| 亚洲国产成人久久77| 国产在线观看91精品| 五月婷婷丁香色| 国产精品护士| 在线不卡免费视频| 色噜噜久久| 青青草a国产免费观看| 欧美97欧美综合色伦图| 国产99热| a网站在线观看| 日本高清在线看免费观看| 啦啦啦网站在线观看a毛片| 国产91精品最新在线播放| 日本高清有码人妻| 亚洲AV无码乱码在线观看裸奔| 精品三级在线| 97久久精品人人做人人爽| 67194亚洲无码| 日韩激情成人| 成人免费一区二区三区| 国产精品亚欧美一区二区| 青青青草国产| 扒开粉嫩的小缝隙喷白浆视频| 无遮挡一级毛片呦女视频| 女人18毛片水真多国产| 日韩美毛片| 尤物成AV人片在线观看| 久久精品这里只有精99品| 69国产精品视频免费| 欧美日韩另类国产| 午夜福利在线观看入口| 国产拍揄自揄精品视频网站| 国产乱人免费视频| 毛片视频网址| 亚洲人妖在线| 欧美精品黑人粗大| 天天综合网色| 国产极品美女在线观看| 91在线精品免费免费播放| 亚洲人成日本在线观看| 日日拍夜夜操| 亚洲男人天堂网址| 国产高清自拍视频| 国产成人高清亚洲一区久久| 狠狠色丁香婷婷| 亚洲成人精品在线| 国产精品永久免费嫩草研究院| 国产一区成人| 国产麻豆精品在线观看| 国产成人精品一区二区秒拍1o| 久久久久免费精品国产| 欧美精品亚洲二区| 亚洲欧美一区在线| 激情六月丁香婷婷| 亚洲综合专区| 99色亚洲国产精品11p| 高清码无在线看| 亚欧成人无码AV在线播放| 久久国产精品波多野结衣| 欧美特黄一级大黄录像| 国产丝袜啪啪| 一本久道热中字伊人|