編碼問題詳解_第1頁
編碼問題詳解_第2頁
編碼問題詳解_第3頁
編碼問題詳解_第4頁
編碼問題詳解_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、問題研究-字符集編碼1. 概述本文主要包括以下幾個(gè)方面:編碼基本知識(shí),java,系統(tǒng)軟件,url,工具軟件等。在下面的描述中,將以"中文"兩個(gè)字為例,經(jīng)查表可以知道其GB2312編碼是"d6d0 cec4",Unicode編碼為"4e2d 6587",UTF編碼就是"e4b8ad e69687"。注意,這兩個(gè)字沒有iso8859-1編碼,但可以用iso8859-1編碼來"表示"。2. 編碼基本知識(shí)最早的編碼是iso8859-1,和ascii編碼相似。但為了方便表示各種各樣的語言,逐漸出現(xiàn)了很多標(biāo)

2、準(zhǔn)編碼,重要的有如下幾個(gè)。2.1. iso8859-1屬于單字節(jié)編碼,最多能表示的字符范圍是0-255,應(yīng)用于英文系列。比如,字母'a'的編碼為0x61=97。很明顯,iso8859-1編碼表 示的字符范圍很窄,無法表示中文字符。但是,由于是單字節(jié)編碼,和計(jì)算機(jī)最基礎(chǔ)的表示單位一致,所以很多時(shí)候,仍舊使用iso8859-1編碼來表示。而 且在很多協(xié)議上,默認(rèn)使用該編碼。比如,雖然"中文"兩個(gè)字不存在iso8859-1編碼,以gb2312編碼為例,應(yīng)該是"d6d0 cec4"兩個(gè)字符,使用iso8859-1編碼的時(shí)候則將它拆開為4個(gè)字節(jié)來表

3、示:"d6 d0 ce c4"(事實(shí)上,在進(jìn)行存儲(chǔ)的時(shí)候,也是以字節(jié)為單位處理的)。而如果是UTF編碼,則是6個(gè)字節(jié)"e4 b8 ad e6 96 87"。很明顯,這種表示方法還需要以另一種編碼為基礎(chǔ)。2.2. GB2312/GBK這就是漢子的國標(biāo)碼,專門用來表示漢字,是雙字節(jié)編碼,而英文字母和iso8859-1一致(兼容iso8859-1編碼)。其中g(shù)bk編碼能夠用來同時(shí)表示繁體字和簡體字,而gb2312只能表示簡體字,gbk是兼容gb2312編碼的。2.3. unicode這是最統(tǒng)一的編碼,可以用來表示所 有語言的字符,而且是定長雙字節(jié)(也有四字節(jié)的

4、)編碼,包括英文字母在內(nèi)。所以可以說它是不兼容iso8859-1編碼的,也不兼容任何編碼。不過,相對 于iso8859-1編碼來說,uniocode編碼只是在前面增加了一個(gè)0字節(jié),比如字母'a'為"00 61"。需要說明的是,定長編碼便于計(jì)算機(jī)處理(注意GB2312/GBK不是定長編碼),而unicode又可以用來表示所有字符,所以在很多軟件內(nèi)部是使用unicode編碼來處理的,比如java。2.4. UTF考慮到unicode編碼不兼容 iso8859-1編碼,而且容易占用更多的空間:因?yàn)閷τ谟⑽淖帜?,unicode也需要兩個(gè)字節(jié)來表示。所以u(píng)nicode

5、不便于傳輸和存儲(chǔ)。因此而 產(chǎn)生了utf編碼,utf編碼兼容iso8859-1編碼,同時(shí)也可以用來表示所有語言的字符,不過,utf編碼是不定長編碼,每一個(gè)字符的長度從1-6 個(gè)字節(jié)不等。另外,utf編碼自帶簡單的校驗(yàn)功能。一般來講,英文字母都是用一個(gè)字節(jié)表示,而漢字使用三個(gè)字節(jié)。注意,雖然說utf是為了使用更少 的空間而使用的,但那只是相對于unicode編碼來說,如果已經(jīng)知道是漢字,則使用GB2312/GBK無疑是最節(jié)省的。不過另一方面,值得說明的是, 雖然utf編碼對漢字使用3個(gè)字節(jié),但即使對于漢字網(wǎng)頁,utf編碼也會(huì)比unicode編碼節(jié)省,因?yàn)榫W(wǎng)頁中包含了很多的英文字符。3. java對

6、字符的處理在java應(yīng)用軟件中,會(huì)有多處涉及到字符集編碼,有些地方需要進(jìn)行正確的設(shè)置,有些地方需要進(jìn)行一定程度的處理。3.1. getBytes(charset)這是java字符串處理的一個(gè)標(biāo)準(zhǔn)函數(shù),其作用是將字符串所表示的字符按照charset編碼,并以字節(jié)方式表示。注意字符串在java內(nèi)存中總是按unicode編碼存儲(chǔ)的。比如"中文",正常情況下(即沒有錯(cuò)誤的時(shí)候)存儲(chǔ)為"4e2d 6587",如果charset為"gbk",則被編碼為"d6d0 cec4",然后返回字節(jié)"d6 d0 ce c4&qu

7、ot;。如果charset為"utf8"則最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1",則由于無法編碼,最后返回 "3f 3f"(兩個(gè)問號(hào))。3.2. new String(charset)這是java字符串處理的另一個(gè)標(biāo)準(zhǔn)函數(shù),和上一個(gè)函數(shù)的作用相反,將字節(jié)數(shù)組按照charset編碼進(jìn)行組合識(shí)別,最后轉(zhuǎn)換為unicode存儲(chǔ)。參考上述getBytes的例子,"gbk" 和"utf8"都可以得出正確的結(jié)果"4e2d 6587"

8、,但iso8859-1最后變成了"003f 003f"(兩個(gè)問號(hào))。因?yàn)閡tf8可以用來表示/編碼所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) = str,即完全可逆。3.3. setCharacterEncoding()該函數(shù)用來設(shè)置http請求或者相應(yīng)的編碼。對于request,是指提交內(nèi)容 的編碼,指定后可以通過getParameter()則直接獲得正確的字符串,如果不指定,則默認(rèn)使用iso8859-1編碼,需要進(jìn)一步處理。參見下 述"表單輸入"。值得

9、注意的是在執(zhí)行setCharacterEncoding()之前,不能執(zhí)行任何getParameter()。java doc上說明:This method must be called prior to reading request parameters or reading input using getReader()。而且,該指定只對POST方法有效,對GET方法無效。分析原因,應(yīng)該是在執(zhí)行第一個(gè)getParameter()的時(shí) 候,java將會(huì)按照編碼分析所有的提交內(nèi)容,而后續(xù)的getParameter()不再進(jìn)行分析,所以setCharacterEncoding()無 效。而對于GE

10、T方法提交表單是,提交的內(nèi)容在URL中,一開始就已經(jīng)按照編碼分析所有的提交內(nèi)容,setCharacterEncoding()自然就 無效。對于response,則是指定輸出內(nèi)容的編碼,同時(shí),該設(shè)置會(huì)傳遞給瀏覽器,告訴瀏覽器輸出內(nèi)容所采用的編碼。3.4. 處理過程下面分析兩個(gè)有代表性的例子,說明java對編碼有關(guān)問題的處理方法。3.4.1. 表單輸入U(xiǎn)ser input  *(gbk:d6d0 cec4)  browser  *(gbk:d6d0 cec4)  web server  iso8859-1(00d6 00d 000ce 00c4)&

11、#160; class,需要在class中進(jìn)行處理:getbytes("iso8859-1")為d6 d0 ce c4,new String("gbk")為d6d0 cec4,內(nèi)存中以u(píng)nicode編碼則為4e2d 6587。l 用戶輸入的編碼方式和頁面指定的編碼有關(guān),也和用戶的操作系統(tǒng)有關(guān),所以是不確定的,上例以gbk為例。l 從browser到web server,可以在表單中指定提交內(nèi)容時(shí)使用的字符集,否則會(huì)使用頁面指定的編碼。而如果在url中直接用?的方式輸入?yún)?shù),則其編碼往往是操作系統(tǒng)本身的編碼,因?yàn)檫@時(shí)和頁面無關(guān)。上述仍舊以gbk編碼為例。l

12、 Web server接收到的是字節(jié)流,默認(rèn)時(shí)(getParameter)會(huì)以iso8859-1編碼處理之,結(jié)果是不正確的,所以需要進(jìn)行處理。但如果預(yù)先設(shè) 置了編碼(通過request. setCharacterEncoding ()),則能夠直接獲取到正確的結(jié)果。l 在頁面中指定編碼是個(gè)好習(xí)慣,否則可能失去控制,無法指定正確的編碼。3.4.2. 文件編譯假設(shè)文件是gbk編碼保存的,而編譯有兩種編碼選擇:gbk或者iso8859-1,前者是中文windows的默認(rèn)編碼,后者是linux的默認(rèn)編碼,當(dāng)然也可以在編譯時(shí)指定編碼。Jsp  *(gbk:d6d0 cec4)  ja

13、va file  *(gbk:d6d0 cec4)  compiler read  uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)  compiler write  utf(gbk: e4b8ad e69687; iso8859-1: *)  compiled file  unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)  class。所以用gbk編碼保存,而用iso8859-1編譯的結(jié)果是

14、不正確的。class  unicode(4e2d 6587)  system.out / jsp.out  gbk(d6d0 cec4)  os console / browser。l 文件可以以多種編碼方式保存,中文windows下,默認(rèn)為ansi/gbk。l 編譯器讀取文件時(shí),需要得到文件的編碼,如果未指定,則使用系統(tǒng)默認(rèn)編碼。一般class文件,是以系統(tǒng)默認(rèn)編碼保存的,所以編譯不會(huì)出問題,但對于 jsp文件,如果在中文windows下編輯保存,而部署在英文linux下運(yùn)行/編譯,則會(huì)出現(xiàn)問題。所以需要在jsp文件中用 pageEncoding指定編

15、碼。l Java編譯的時(shí)候會(huì)轉(zhuǎn)換成統(tǒng)一的unicode編碼處理,最后保存的時(shí)候再轉(zhuǎn)換為utf編碼。l 當(dāng)系統(tǒng)輸出字符的時(shí)候,會(huì)按指定編碼輸出,對于中文windows下,System.out將使用gbk編碼,而對于response(瀏覽器),則使用 jsp文件頭指定的contentType,或者可以直接為response指定編碼。同時(shí),會(huì)告訴browser網(wǎng)頁的編碼。如果未指定,則會(huì)使用 iso8859-1編碼。對于中文,應(yīng)該為browser指定輸出字符串的編碼。l browser顯示網(wǎng)頁的時(shí)候,首先使用response中指定的編碼(jsp文件頭指定的contentType最終也反映在respo

16、nse上),如果未指定,則會(huì)使用網(wǎng)頁中meta項(xiàng)指定中的contentType。3.5. 幾處設(shè)置對于web應(yīng)用程序,和編碼有關(guān)的設(shè)置或者函數(shù)如下。3.5.1. jsp編譯指定文件的存儲(chǔ)編碼,很明顯,該設(shè)置應(yīng)該置于文件的開頭。例如:<%page pageEncoding="GBK"%>。另外,對于一般class文件,可以在編譯的時(shí)候指定編碼。3.5.2. jsp輸出指定文件輸出到browser是使 用的編碼,該設(shè)置也應(yīng)該置于文件的開頭。例如:<% page contentType="text/html; charset= GBK" %&

17、gt;。該設(shè)置和response.setCharacterEncoding("GBK")等效。3.5.3. meta設(shè)置指定網(wǎng)頁使用的編碼,該設(shè)置對靜態(tài)網(wǎng)頁尤其有作用。因?yàn)殪o態(tài)網(wǎng)頁無法采用jsp的設(shè)置,而且也無法執(zhí)行response.setCharacterEncoding()。例如:<META http-equiv="Content-Type" content="text/html; charset=GBK" />如果同時(shí)采用了jsp輸出和meta設(shè)置兩種編碼指定方式,則jsp指定的優(yōu)先。因?yàn)閖sp指定的直接體現(xiàn)在res

18、ponse中。需要注意的是,apache有一個(gè)設(shè)置可以給無編碼指定的網(wǎng)頁指定編碼,該指定等同于jsp的編碼指定方式,所以會(huì)覆蓋靜態(tài)網(wǎng)頁中的meta指定。所以有人建議關(guān)閉該設(shè)置。3.5.4. form設(shè)置當(dāng)瀏覽器提交表單的時(shí)候,可以指定相應(yīng)的編碼。例如:<form accept-charset= "gb2312">。一般不必不使用該設(shè)置,瀏覽器會(huì)直接使用網(wǎng)頁的編碼。4. 系統(tǒng)軟件下面討論幾個(gè)相關(guān)的系統(tǒng)軟件。4.1. mysql數(shù)據(jù)庫很明顯,要支持多語言,應(yīng)該將數(shù)據(jù)庫的編碼設(shè)置成utf或者unicode,而utf更適合與存儲(chǔ)。但是,如果中文數(shù)據(jù)中包含的英文字母很少,

19、其實(shí)unicode更為適合。數(shù)據(jù)庫的編碼可以通過mysql的 配置文件設(shè)置,例如default-character-set=utf8。還可以在數(shù)據(jù)庫鏈接URL中設(shè)置,例如: useUnicode=true&characterEncoding=UTF-8。注意這兩者應(yīng)該保持一致,在新的sql版本里,在數(shù)據(jù)庫鏈接 URL里可以不進(jìn)行設(shè)置,但也不能是錯(cuò)誤的設(shè)置。4.2. apacheappache和編碼有關(guān)的配置在httpd.conf中,例如AddDefaultCharset UTF-8。如前所述,該功能會(huì)將所有靜態(tài)頁面的編碼設(shè)置為UTF-8,最好關(guān)閉該功能。另外,apache還有單獨(dú)的模塊

20、來處理網(wǎng)頁響應(yīng)頭,其中也可能對編碼進(jìn)行設(shè)置。4.3. linux默認(rèn)編碼這里所說的linux默認(rèn)編碼,是指運(yùn)行時(shí)的環(huán)境變量。兩個(gè)重要的環(huán)境變量是LC_ALL和LANG,默認(rèn)編碼會(huì)影響到j(luò)ava URLEncode的行為,下面有描述。建議都設(shè)置為"zh_CN.UTF-8"。4.4. 其它為了支持中文文件名,linux在加載磁盤時(shí)應(yīng)該指定字符集,例如:mount /dev/hda5 /mnt/hda5/ -t ntfs -o iocharset=gb2312。另外,如前所述,使用GET方法提 交的信息不支持request.setCharacterEncoding(),但可以通過

21、tomcat的配置文件指定字符集,在tomcat的 server.xml文件中,形如:<Connector . URIEncoding="GBK"/>。這種方法將統(tǒng)一設(shè)置所有請求,而不能針對具體頁面進(jìn)行設(shè)置,也不一定和browser使用的編碼相同,所 以有時(shí)候并不是所期望的。5. URL地址URL地址中含有中文字符是很麻煩的,前面描述過使用GET方法提交表單的情況,使用GET方法時(shí),參數(shù)就是包含在URL中。5.1. URL編碼對于URL中的一些特殊字符,瀏覽器會(huì)自動(dòng)進(jìn)行編碼。這些字符除了"/?&"等外,還包括unicode字符,比如漢

22、子。這時(shí)的編碼比較特殊。IE有一個(gè)選項(xiàng)"總是使用UTF- 8發(fā)送URL",當(dāng)該選項(xiàng)有效時(shí),IE將會(huì)對特殊字符進(jìn)行UTF-8編碼,同時(shí)進(jìn)行URL編碼。如果改選項(xiàng)無效,則使用默認(rèn)編碼"GBK",并且不進(jìn)行 URL編碼。但是,對于URL后面的參數(shù),則總是不進(jìn)行編碼,相當(dāng)于UTF-8選項(xiàng)無效。比如"中文.html?a=中文",當(dāng)UTF-8選項(xiàng)有效時(shí),將 發(fā)送鏈接"%e4%b8%ad%e6%96%87.html?a=x4ex2dx65x87";而UTF-8選項(xiàng)無效時(shí),將發(fā)送鏈接"x4ex2dx65x87.html?

23、a=x4ex2dx65x87"。注意后者前面的"中文"兩個(gè)字只有4個(gè)字節(jié),而前者卻有18個(gè)字節(jié),這主要時(shí)URL編碼的原因。當(dāng)web server(tomcat)接收到該鏈接時(shí),將會(huì)進(jìn)行URL解碼,即去掉"%",同時(shí)按照ISO8859-1編碼(上面已經(jīng)描述,可以使用URLEncoding來設(shè)置成其它編碼)識(shí)別。上述例子的結(jié)果分別是"ue4ub8uadue6u96u87.html?a=u4eu2du65u87"和"u4eu2du65u87.html?a=u4eu2du65u87",注意前者前面的"中

24、文"兩個(gè)字恢復(fù)成了6個(gè)字符。這里用"u",表示是unicode。所以,由于客戶端設(shè)置的不同,相同的鏈接,在服務(wù)器上得到了不同結(jié)果。這個(gè)問題不少人都遇到,卻沒有很好的解決辦法。所以有的網(wǎng)站會(huì)建議用戶嘗試關(guān)閉UTF-8選項(xiàng)。不過,下面會(huì)描述一個(gè)更好的處理辦法。5.2. rewrite熟悉的人都知道,apache有一 個(gè)功能強(qiáng)大的rewrite模塊,這里不描述其功能。需要說明的是該模塊會(huì)自動(dòng)將URL解碼(去除%),即完成上述web server(tomcat)的部分功能。有相關(guān)文檔介紹說可以使用NE參數(shù)來關(guān)閉該功能,但我試驗(yàn)并未成功,可能是因?yàn)榘姹荆ㄎ沂褂玫氖?apac

25、he 2.0.54)問題。另外,當(dāng)參數(shù)中含有"?& "等符號(hào)的時(shí)候,該功能將導(dǎo)致系統(tǒng)得不到正常結(jié)果。rewrite本身似乎完全是采用字節(jié)處理的方式,而不考慮字符串的編碼,所以不會(huì)帶來編碼問題。5.3. URLEncode.encode()這是Java本身提供對的URL編碼函數(shù),完成的工作和上述UTF-8選項(xiàng)有效時(shí)瀏覽器所做的工作相似。值得說明的是,java已經(jīng)不贊成不指定編碼來使用該方法(deprecated)。應(yīng)該在使用的時(shí)候增加編碼指定。當(dāng)不指定編碼的時(shí)候,該方法使用系統(tǒng)默認(rèn)編碼,這會(huì)導(dǎo)致軟件運(yùn)行結(jié)果得不確定。比如對于"中文",當(dāng)系統(tǒng)默認(rèn)編碼

26、為"gb2312"時(shí),結(jié)果是"%4e%2d%65%87",而默認(rèn)編碼為"UTF-8",結(jié)果卻是"%e4%b8%ad%e6%96%87",后續(xù)程序?qū)㈦y以處理。另外,這兒說的系統(tǒng)默認(rèn)編碼是由運(yùn)行tomcat時(shí)的環(huán)境變量LC_ALL和LANG等決定的,曾經(jīng)出現(xiàn)過tomcat重啟后就出現(xiàn)亂碼的問題,最后才郁悶的發(fā)現(xiàn)是因?yàn)樾薷男薷牧诉@兩個(gè)環(huán)境變量。建議統(tǒng)一指定為"UTF-8"編碼,可能需要修改相應(yīng)的程序。5.4. 一個(gè)解決方案上面說起過,因?yàn)闉g覽器設(shè)置的不同,對于同一個(gè)鏈接,web server收到的是不

27、同內(nèi)容,而軟件系統(tǒng)有無法知道這中間的區(qū)別,所以這一協(xié)議目前還存在缺陷。針對具體問題,不應(yīng)該僥幸認(rèn)為所有客戶的IE設(shè)置都是UTF-8有效的,也不應(yīng)該粗暴的建議用戶修改IE設(shè)置,要知道,用戶不可能去記住每一個(gè)web server的設(shè)置。所以,接下來的解決辦法就只能是讓自己的程序多一點(diǎn)智能:根據(jù)內(nèi)容來分析編碼是否UTF-8。比較幸運(yùn)的是UTF-8編碼相當(dāng)有規(guī)律,所以可以通過分析傳輸過來的鏈接內(nèi)容,來判斷是否是正確的UTF-8字符,如果是,則以UTF-8處理之,如果不是,則使用客戶默認(rèn)編碼(比如"GBK"),下面是一個(gè)判斷是否UTF-8的例子,如果你了解相應(yīng)規(guī)律,就容易理解。pub

28、lic static boolean isValidUtf8(byte b,int aMaxCount)       int lLen=b.length,lCharCount=0;       for(int i=0;i<lLen && lCharCount<aMaxCount;+lCharCount)            &#

29、160; byte lByte=bi+;/to fast operation, + now, ready for the following for(;)              if(lByte>=0) continue;/>=0 is normal ascii              if(lByte<(byte

30、)0xc0 | lByte>(byte)0xfd) return false;              int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4                     :lBy

31、te>(byte)0xf0?3:lByte>(byte)0xe0?2:1;              if(i+lCount>lLen) return false;              for(int j=0;j<lCount;+j,+i) if(bi>=(byte)0xc0) return false

32、;              return true;相應(yīng)地,一個(gè)使用上述方法的例子如下:public static String getUrlParam(String aStr,String aDefaultCharset)throws UnsupportedEncodingException       if(aStr=null) return null;     

33、;  byte lBytes=aStr.getBytes("ISO-8859-1");       return new String(lBytes,StringUtil.isValidUtf8(lBytes)?"utf8":aDefaultCharset);不過,該方法也存在缺陷,如下兩方面:l 沒有包括對用戶默認(rèn)編碼的識(shí)別,這可以根據(jù)請求信息的語言來判斷,但不一定正確,因?yàn)槲覀冇袝r(shí)候也會(huì)輸入一些韓文,或者其他文字。l 可能會(huì)錯(cuò)誤判斷UTF-8字符,一個(gè)例子是"學(xué)習(xí)"兩個(gè)字,其GBK編碼是" xd1xa7xcfxb0",如果使用上述isValidUtf8方法判斷,將返回true。可以考慮使用更嚴(yán)格的判斷方法,不過估計(jì)效果不大。有一個(gè)例子可以證明google也遇到了上述問題,而且也采用了和上述相似的處理方法,比如,如果在地址欄中輸入"最后,應(yīng)該補(bǔ)充說明一下,如果不使用rewrite規(guī)則,或者通過表單提交數(shù)據(jù),其實(shí)并不一定會(huì)遇到上述問題,因?yàn)檫@時(shí)可以在提交數(shù)據(jù)時(shí)指定希望的編碼。另外,中文文件名確實(shí)會(huì)帶來問題,應(yīng)該謹(jǐn)慎使用。6. 其它下面

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論