backup2007

          導(dǎo)航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統(tǒng)計(jì)

          公告

          @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);


          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          2008年1月17日 #

          編碼問題3轉(zhuǎn)

          世界上的各地區(qū)都有本地的語言。地區(qū)差異直接導(dǎo)致了語言環(huán)境的差異。在開發(fā)一個(gè)國(guó)際化程序的過程中,處理語言問題就顯得很重要了。

            這是一個(gè)世界范圍內(nèi)都存在的問題,所以,Java提供了世界性的解決方法。本文描述的方法是用于處理中文的,但是,推而廣之,對(duì)于處理世界上其它國(guó)家和地區(qū)的語言同樣適用。

            漢字是雙字節(jié)的。所謂雙字節(jié)是指一個(gè)雙字要占用兩個(gè)BYTE的位置(即16位),分別稱為高位和低位。中國(guó)規(guī)定的漢字編碼為GB2312,這是 強(qiáng)制性的,目前幾乎所有的能處理中文的應(yīng)用程序都支持GB2312。GB2312包括了一二級(jí)漢字和9區(qū)符號(hào),高位從0xa1到0xfe,低位也是從 0xa1到0xfe,其中,漢字的編碼范圍為0xb0a1到0xf7fe。

            另外有一種編碼,叫做GBK,但這是一份規(guī)范,不是強(qiáng)制的。GBK提供了20902個(gè)漢字,它兼容GB2312,編碼范圍為0x8140到0xfefe。GBK中的所有字符都可以一一映射到Unicode 2.0。

            在不久的將來,中國(guó)會(huì)頒布另一種標(biāo)準(zhǔn):GB18030-2000(GBK2K)。它收錄了藏、蒙等少數(shù)民族的字型,從根本上解決了字位不足的問 題。注意:它不再是定長(zhǎng)的。其二字節(jié)部份與GBK兼容,四字節(jié)部分是擴(kuò)充的字符、字形。它的首字節(jié)和第三字節(jié)從0x81到0xfe,二字節(jié)和第四字節(jié)從 0x30到0x39。

            本文不打算介紹Unicode,有興趣的可以瀏覽“http://www.unicode.org/”查看更多的信息。Unicode有一個(gè)特 性:它包括了世界上所有的字符字形。所以,各個(gè)地區(qū)的語言都可以建立與Unicode的映射關(guān)系,而Java正是利用了這一點(diǎn)以達(dá)到異種語言之間的轉(zhuǎn)換。

            在JDK中,與中文相關(guān)的編碼有:

            表1 JDK中與中文相關(guān)的編碼列表
          編碼名稱 說明
          ASCII 7位,與ascii7相同
          ISO8859-1 8-位,與 8859_1,ISO-8859-1,ISO_8859-1,latin1...等相同
          GB2312-80 16位,與gb2312,gb2312-1980,EUC_CN,euccn,1381,Cp1381, 1383, Cp1383, ISO2022CN,ISO2022CN_GB...等相同
          GBK 與MS936相同,注意:區(qū)分大小寫
          UTF8 與UTF-8相同
          GB18030 與cp1392、1392相同,目前支持的JDK很少

            在實(shí)際編程時(shí),接觸得比較多的是GB2312(GBK)和ISO8859-1。

            為什么會(huì)有“?”號(hào)

            上文說過,異種語言之間的轉(zhuǎn)換是通過Unicode來完成的。假設(shè)有兩種不同的語言A和B,轉(zhuǎn)換的步驟為:先把A轉(zhuǎn)化為Unicode,再把Unicode轉(zhuǎn)化為B。

            舉例說明。有GB2312中有一個(gè)漢字“李”,其編碼為“C0EE”,欲轉(zhuǎn)化為ISO8859-1編碼。步驟為:先把“李”字轉(zhuǎn)化為 Unicode,得到“674E”,再把“674E”轉(zhuǎn)化為ISO8859-1字符。當(dāng)然,這個(gè)映射不會(huì)成功,因?yàn)镮SO8859-1中根本就沒有與 “674E”對(duì)應(yīng)的字符。

            當(dāng)映射不成功時(shí),問題就發(fā)生了!當(dāng)從某語言向Unicode轉(zhuǎn)化時(shí),如果在某語言中沒有該字符,得到的將是Unicode的代碼“" uffffd”(“"u”表示是Unicode編碼,)。而從Unicode向某語言轉(zhuǎn)化時(shí),如果某語言沒有對(duì)應(yīng)的字符,則得到的是“0x3f” (“?”)。這就是“?”的由來。

            例如:把字符流buf =“0x80 0x40 0xb0 0xa1”進(jìn)行new String(buf, "gb2312")操作,得到的結(jié)果是“"ufffd"u554a”,再println出來,得到的結(jié)果將是“?啊”,因?yàn)?#8220;0x80 0x40”是GBK中的字符,在GB2312中沒有。

            再如,把字符串String=""u00d6"u00ec"u00e9"u0046"u00bb"u00f9"進(jìn)行new String (buf.getBytes("GBK"))操作,得到的結(jié)果是“3fa8aca8a6463fa8b4”,其中,“"u00d6”在“GBK”中沒有對(duì) 應(yīng)的字符,得到“3f”,“"u00ec”對(duì)應(yīng)著“a8ac”,“"u00e9”對(duì)應(yīng)著“a8a6”,“0046”對(duì)應(yīng)著“46”(因?yàn)檫@是ASCII字 符),“"u00bb”沒找到,得到“3f”,最后,“"u00f9”對(duì)應(yīng)著“a8b4”。把這個(gè)字符串println一下,得到的結(jié)果是“?ìéF? ù”。看到?jīng)]?這里并不全是問號(hào),因?yàn)镚BK與Unicode映射的內(nèi)容中除了漢字外還有字符,本例就是最好的明證。

            所以,在漢字轉(zhuǎn)碼時(shí),如果發(fā)生錯(cuò)亂,得到的不一定都是問號(hào)噢!不過,錯(cuò)了終究是錯(cuò)了,50步和100步并沒有質(zhì)的差別。

            或者會(huì)問:如果源字符集中有,而Unicode中沒有,結(jié)果會(huì)如何?回答是不知道。因?yàn)槲沂诸^沒有能做這個(gè)測(cè)試的源字符集。但有一點(diǎn)是肯定的,那就是源字符集不夠規(guī)范。在Java中,如果發(fā)生這種情況,是會(huì)拋出異常的。

          什么是UTF

            UTF,是Unicode Text Format的縮寫,意為Unicode文本格式。對(duì)于UTF,是這樣定義的:

            (1)如果Unicode的16位字符的頭9位是0,則用一個(gè)字節(jié)表示,這個(gè)字節(jié)的首位是“0”,剩下的7位與原字符中的后7位相同,如“" u0034”(0000 0000 0011 0100),用“34” (0011 0100)表示;(與源Unicode字符是相同的);

            (2)如果Unicode的16位字符的頭5位是0,則用2個(gè)字節(jié)表示,首字節(jié)是“110”開頭,后面的5位與源字符中除去頭5個(gè)零后的最高5 位相同;第二個(gè)字節(jié)以“10”開頭,后面的6位與源字符中的低6位相同。如“"u025d”(0000 0010 0101 1101),轉(zhuǎn)化后為“c99d”(1100 1001 1001 1101);

            (3)如果不符合上述兩個(gè)規(guī)則,則用三個(gè)字節(jié)表示。第一個(gè)字節(jié)以“1110”開頭,后四位為源字符的高四位;第二個(gè)字節(jié)以“10”開頭,后六位 為源字符中間的六位;第三個(gè)字節(jié)以“10”開頭,后六位為源字符的低六位;如“"u9da7”(1001 1101 1010 0111),轉(zhuǎn)化為“e9b6a7”(1110 1001 1011 0110 1010 0111);

            可以這么描述JAVA程序中Unicode與UTF的關(guān)系,雖然不絕對(duì):字符串在內(nèi)存中運(yùn)行時(shí),表現(xiàn)為Unicode代碼,而當(dāng)要保存到文件或其它介質(zhì)中去時(shí),用的是UTF。這個(gè)轉(zhuǎn)化過程是由writeUTF和readUTF來完成的。

            好了,基礎(chǔ)性的論述差不多了,下面進(jìn)入正題。

            先把這個(gè)問題想成是一個(gè)黑匣子。先看黑匣子的一級(jí)表示:

          input(charsetA)->process(Unicode)->output(charsetB)

            簡(jiǎn)單,這就是一個(gè)IPO模型,即輸入、處理和輸出。同樣的內(nèi)容要經(jīng)過“從charsetA到unicode再到charsetB”的轉(zhuǎn)化。

            再看二級(jí)表示:

          SourceFile(jsp,java)->class->output

            在這個(gè)圖中,可以看出,輸入的是jsp和java源文件,在處理過程中,以Class文件為載體,然后輸出。再細(xì)化到三級(jí)表示:

          jsp->temp file->class->browser,os console,db

          app,servlet->class->browser,os console,db

            這個(gè)圖就更明白了。Jsp文件先生成中間的Java文件,再生成Class。而Servlet和普通App則直接編譯生成Class。然后,從Class再輸出到瀏覽器、控制臺(tái)或數(shù)據(jù)庫等。

            JSP:從源文件到Class的過程

            Jsp的源文件是以“.jsp”結(jié)尾的文本文件。在本節(jié)中,將闡述JSP文件的解釋和編譯過程,并跟蹤其中的中文變化。

            1、JSP/Servlet引擎提供的JSP轉(zhuǎn)換工具(jspc)搜索JSP文件中用<%@ page contentType ="text/html; charset=<Jsp-charset>"%>中指定的charset。如果在JSP文件中未指定<Jsp- charset>,則取JVM中的默認(rèn)設(shè)置file.encoding,一般情況下,這個(gè)值是ISO8859-1;

            2、jspc用相當(dāng)于“javac –encoding <Jsp-charset>”的命令解釋JSP文件中出現(xiàn)的所有字符,包括中文字符和ASCII字符,然后把這些字符轉(zhuǎn)換成Unicode字 符,再轉(zhuǎn)化成UTF格式,存為JAVA文件。ASCII碼字符轉(zhuǎn)化為Unicode字符時(shí)只是簡(jiǎn)單地在前面加“00”,如“A”,轉(zhuǎn)化為“"u0041” (不需要理由,Unicode的碼表就是這么編的)。然后,經(jīng)過到UTF的轉(zhuǎn)換,又變回“41”了!這也就是可以使用普通文本編輯器查看由JSP生成的 JAVA文件的原因;

            3、引擎用相當(dāng)于“javac –encoding UNICODE”的命令,把JAVA文件編譯成CLASS文件;

            先看一下這些過程中中文字符的轉(zhuǎn)換情況。有如下源代碼:

          <%@ page contentType="text/html; charset=gb2312"%>
          <html><body>
          <%
          String a="中文";
          out.println(a);
          %>
          </body></html>

            這段代碼是在UltraEdit for Windows上編寫的。保存后,“中文”兩個(gè)字的16進(jìn)制編碼為“D6 D0 CE C4”(GB2312編碼)。經(jīng)查表,“中文”兩字的Unicode編碼為“"u4E2D"u6587”,用 UTF表示就是“E4 B8 AD E6 96 87”。打開引擎生成的由JSP文件轉(zhuǎn)變而成的JAVA文件,發(fā)現(xiàn)其中的“中文”兩個(gè)字確實(shí)被“E4 B8 AD E6 96 87”替代了,再查看由JAVA文件編譯生成的CLASS文件,發(fā)現(xiàn)結(jié)果與JAVA文件中的完全一樣。

            再看JSP中指定的CharSet為ISO-8859-1的情況。

          <%@ page contentType="text/html; charset=ISO-8859-1"%>
          <html><body>
          <%
          String a="中文";
          out.println(a);
          %>
          </body></html>

            同樣,該文件是用UltraEdit編寫的,“中文”這兩個(gè)字也是存為GB2312編碼“D6 D0 CE C4”。先模擬一下生成的JAVA文件和CLASS文件的過程:jspc用ISO-8859-1來解釋“中文”,并把它映射到Unicode。由于ISO -8859-1是8位的,且是拉丁語系,其映射規(guī)則就是在每個(gè)字節(jié)前加“00”,所以,映射后的Unicode編碼應(yīng)為“"u00D6"u00D0" u00CE"u00C4”,轉(zhuǎn)化成UTF后應(yīng)該是“C3 96 C3 90 C3 8E C3 84”。好,打開文件看一下,JAVA文件和CLASS文件中,“中文”果然都表示為“C3 96 C3 90 C3 8E C3 84”。

            如果上述代碼中不指定<Jsp-charset>,即把第一行寫成“<%@ page contentType="text/html" %>”,JSPC會(huì)使用file.encoding的設(shè)置來解釋JSP文件。在RedHat 6.2上,其處理結(jié)果與指定為ISO-8859-1是完全相同的。

            到現(xiàn)在為止,已經(jīng)解釋了從JSP文件到CLASS文件的轉(zhuǎn)變過程中中文字符的映射過程。一句話:從“JspCharSet到Unicode再到UTF”。下表總結(jié)了這個(gè)過程:

            表2 “中文”從JSP到CLASS的轉(zhuǎn)化過程
          Jsp-CharSet JSP文件中 JAVA文件中 CLASS文件中
          GB2312 D6 D0 CE C4(GB2312) 從"u4E2D"u6587(Unicode)到E4 B8 AD E6 96 87 (UTF) E4 B8 AD E6 96 87 (UTF)
          ISO-8859-1 D6 D0 CE C4
          (GB2312)
          從"u00D6"u00D0"u00CE"u00C4 (Unicode)到C3 96 C3 90 C3 8E C3 84 (UTF) C3 96 C3 90 C3 8E C3 84 (UTF)
          無(默認(rèn)=file.encoding) 同ISO-8859-1 同ISO-8859-1 同ISO-8859-1

          下節(jié)先討論Servlet從JAVA文件到CLASS文件的轉(zhuǎn)化過程,然后再解釋從CLASS文件如何輸出到客戶端。之所以這樣安排,是因?yàn)镴SP和Servlet在輸出時(shí)處理方法是一樣的。

            Servlet:從源文件到Class的過程

            Servlet源文件是以“.java”結(jié)尾的文本文件。本節(jié)將討論Servlet的編譯過程并跟蹤其中的中文變化。

            用“javac”編譯Servlet源文件。javac可以帶“-encoding <Compile-charset>”參數(shù),意思是“用< Compile-charset >中指定的編碼來解釋Serlvet源文件”。

            源文件在編譯時(shí),用<Compile-charset>來解釋所有字符,包括中文字符和ASCII字符。然后把字符常量轉(zhuǎn)變成Unicode字符,最后,把Unicode轉(zhuǎn)變成UTF。

            在Servlet中,還有一個(gè)地方設(shè)置輸出流的CharSet。通常在輸出結(jié)果前,調(diào)用HttpServletResponse的 setContentType方法來達(dá)到與在JSP中設(shè)置<Jsp-charset>一樣的效果,稱之為<Servlet- charset>。

            注意,文中一共提到了三個(gè)變量:<Jsp-charset>、<Compile-charset>和< Servlet-charset>。其中,JSP文件只與<Jsp-charset>有關(guān),而<Compile- charset>和<Servlet-charset>只與Servlet有關(guān)。

            看下例:

          import javax.servlet.*;

          import javax.servlet.http.*;

          class testServlet extends HttpServlet
          {
          public void doGet(HttpServletRequest req,HttpServletResponse resp)
          throws ServletException,java.io.IOException
          {
          resp.setContentType("text/html; charset=GB2312");
          java.io.PrintWriter out=resp.getWriter();
          out.println("<html>");
          out.println("#中文#");
          out.println("</html>");
          }
          }

            該文件也是用UltraEdit for Windows編寫的,其中的“中文”兩個(gè)字保存為“D6 D0 CE C4”(GB2312編碼)。

            開始編譯。下表是<Compile-charset>不同時(shí),CLASS文件中“中文”兩字的十六進(jìn)制碼。在編譯過程中,< Servlet-charset>不起任何作用。<Servlet-charset>只對(duì)CLASS文件的輸出產(chǎn)生影響,實(shí)際上是 <Servlet-charset>和<Compile-charset>一起,達(dá)到與JSP文件中的<Jsp- charset>相同的效果,因?yàn)?lt;Jsp-charset>對(duì)編譯和CLASS文件的輸出都會(huì)產(chǎn)生影響。

            表3 “中文”從Servlet源文件到Class的轉(zhuǎn)變過程
          Compile-charset Servlet源文件中 Class文件中 等效的Unicode碼
          GB2312 D6 D0 CE C4
          (GB2312)
          E4 B8 AD E6 96 87 (UTF) "u4E2D"u6587 (在Unicode中=“中文”)
          ISO-8859-1 D6 D0 CE C4
          (GB2312)
          C3 96 C3 90 C3 8E C3 84 (UTF) "u00D6 "u00D0 "u00CE "u00C4 (在D6 D0 CE C4前面各加了一個(gè)00)
          無(默認(rèn)) D6 D0 CE C4 (GB2312) 同ISO-8859-1 同ISO-8859-1

          普通Java程序的編譯過程與Servlet完全一樣。

          CLASS文件中的中文表示法是不是昭然若揭了?OK,接下來看看CLASS又是怎樣輸出中文的呢?

          Class:輸出字符串

          上文說過,字符串在內(nèi)存中表現(xiàn)為Unicode編碼。至于這種Unicode編碼表示了什么,那要看它是從哪種字符集映射過來的,也就是說要看它的祖先。這好比在托運(yùn)行李時(shí),外觀都是紙箱子,里面裝了什么就要看寄郵件的人實(shí)際郵了什么東西。

          看看上面的例子,如果給一串Unicode編碼“00D6 00D0 00CE 00C4”,如果不作轉(zhuǎn)換,直接用Unicode碼表來對(duì)照它時(shí),是四個(gè)字符(而且是特殊字符);假如把它與“ISO8859-1”進(jìn)行映射,則直接去掉 前面的“00”即可得到“D6 D0 CE C4”,這是ASCII碼表中的四個(gè)字符;而假如把它當(dāng)作GB2312來進(jìn)行映射,得到的結(jié)果很可能是一大堆亂碼,因?yàn)樵贕B2312中有可能沒有(也有 可能有)字符與00D6等字符對(duì)應(yīng)(如果對(duì)應(yīng)不上,將得到0x3f,也就是問號(hào),如果對(duì)應(yīng)上了,由于00D6等字符太靠前,估計(jì)也是一些特殊符號(hào),真正的 漢字在Unicode中的編碼從4E00開始)。

          各位看到了,同樣的Unicode字符,可以解釋成不同的樣子。當(dāng)然,這其中有一種是我們期望的結(jié)果。以上例而論,“D6 D0 CE C4”應(yīng)該是我們所想要的,當(dāng)把“D6 D0 CE C4”輸出到IE中時(shí),用“簡(jiǎn)體中文”方式查看,就能看到清楚的“中文”兩個(gè)字了。(當(dāng)然了,如果你一定要用“西歐字符”來看,那也沒辦法,你將得不到任何有何時(shí)何地的東西)為什么呢?因?yàn)?#8220;00D6 00D0 00CE 00C4”本來就是由ISO8859-1轉(zhuǎn)化過去的。
            給出如下結(jié)論:

          在Class輸出字符串前,會(huì)將Unicode的字符串按照某一種內(nèi)碼重新生成字節(jié)流,然后把字節(jié)流輸入,相當(dāng)于進(jìn)行了一步“String.getBytes(???)”操作。???代表某一種字符集。

          如果是Servlet,那么,這種內(nèi)碼就是在HttpServletResponse.setContentType()方法中指定的內(nèi)碼,也就是上文定義的<Servlet-charset>。

          如果是JSP,那么,這種內(nèi)碼就是在<%@ page contentType=""%>中指定的內(nèi)碼,也就是上文定義的<Jsp-charset>。

          如果是Java程序,那么,這種內(nèi)碼就是file.encoding中指定的內(nèi)碼,默認(rèn)為ISO8859-1。

          當(dāng)輸出對(duì)象是瀏覽器時(shí)

          以流行的瀏覽器IE為例。IE支持多種內(nèi)碼。假如IE接收到了一個(gè)字節(jié)流“D6 D0 CE C4”,你可以嘗試用各種內(nèi)碼去查看。你會(huì)發(fā)現(xiàn)用“簡(jiǎn)體中文”時(shí)能得到正確的結(jié)果。因?yàn)?#8220;D6 D0 CE C4”本來就是簡(jiǎn)體中文中“中文”兩個(gè)字的編碼。

          OK,完整地看一遍。

          JSP:源文件為GB2312格式的文本文件,且JSP源文件中有“中文”這兩個(gè)漢字

          如果指定了<Jsp-charset>為GB2312,轉(zhuǎn)化過程如下表。

          表4 Jsp-charset = GB2312時(shí)的變化過程

          序號(hào) 步驟說明 結(jié)果
          1 編寫JSP源文件,且存為GB2312格式 D6 D0 CE C4
          (D6D0=中 CEC4=文)
          2 jspc把JSP源文件轉(zhuǎn)化為臨時(shí)JAVA文件,并把字符串按照GB2312映射到Unicode,并用UTF格式寫入JAVA文件中 E4 B8 AD E6 96 87
          3 把臨時(shí)JAVA文件編譯成CLASS文件 E4 B8 AD E6 96 87
          4 運(yùn)行時(shí),先從CLASS文件中用readUTF讀出字符串,在內(nèi)存中的是Unicode編碼 4E 2D 65 87(在Unicode中4E2D=中 6587=文)
          5 根據(jù)Jsp-charset=GB2312把Unicode轉(zhuǎn)化為字節(jié)流 D6 D0 CE C4
          6 把字節(jié)流輸出到IE中,并設(shè)置IE的編碼為GB2312(作者按:這個(gè)信息隱藏在HTTP頭中) D6 D0 CE C4
          7 IE用“簡(jiǎn)體中文”查看結(jié)果 “中文”(正確顯示)

          如果指定了<Jsp-charset>為ISO8859-1,轉(zhuǎn)化過程如下表。

          表5 Jsp-charset = ISO8859-1時(shí)的變化過程

          序號(hào) 步驟說明 結(jié)果
          1 編寫JSP源文件,且存為GB2312格式 D6 D0 CE C4
          (D6D0=中 CEC4=文)
          2 jspc把JSP源文件轉(zhuǎn)化為臨時(shí)JAVA文件,并把字符串按照ISO8859-1映射到Unicode,并用UTF格式寫入JAVA文件中 C3 96 C3 90 C3 8E C3 84
          3 把臨時(shí)JAVA文件編譯成CLASS文件 C3 96 C3 90 C3 8E C3 84
          4 運(yùn)行時(shí),先從CLASS文件中用readUTF讀出字符串,在內(nèi)存中的是Unicode編碼 00 D6 00 D0 00 CE 00 C4
          (啥都不是!!!)
          5 根據(jù)Jsp-charset=ISO8859-1把Unicode轉(zhuǎn)化為字節(jié)流 D6 D0 CE C4
          6 把字節(jié)流輸出到IE中,并設(shè)置IE的編碼為ISO8859-1(作者按:這個(gè)信息隱藏在HTTP頭中) D6 D0 CE C4
          7 IE用“西歐字符”查看結(jié)果 亂碼,其實(shí)是四個(gè)ASCII字符,但由于大于128,所以顯示出來的怪模怪樣
          8 改變IE的頁面編碼為“簡(jiǎn)體中文” “中文”(正確顯示)

          奇怪了!為什么把<Jsp-charset>設(shè)成GB2312和ISO8859-1是一個(gè)樣的,都能正確顯示?因?yàn)楸?表5中的第2步和第5步互逆,是相互“抵消”的。只不過當(dāng)指定為ISO8859-1時(shí),要增加第8步操作,殊為不便。

          再看看不指定<Jsp-charset> 時(shí)的情況。

          表6 未指定Jsp-charset 時(shí)的變化過程

          序號(hào) 步驟說明 結(jié)果
          1 編寫JSP源文件,且存為GB2312格式 D6 D0 CE C4
          (D6D0=中 CEC4=文)
          2 jspc把JSP源文件轉(zhuǎn)化為臨時(shí)JAVA文件,并把字符串按照ISO8859-1映射到Unicode,并用UTF格式寫入JAVA文件中 C3 96 C3 90 C3 8E C3 84
          3 把臨時(shí)JAVA文件編譯成CLASS文件 C3 96 C3 90 C3 8E C3 84
          4 運(yùn)行時(shí),先從CLASS文件中用readUTF讀出字符串,在內(nèi)存中的是Unicode編碼 00 D6 00 D0 00 CE 00 C4
          5 根據(jù)Jsp-charset=ISO8859-1把Unicode轉(zhuǎn)化為字節(jié)流 D6 D0 CE C4
          6 把字節(jié)流輸出到IE中 D6 D0 CE C4
          7 IE用發(fā)出請(qǐng)求時(shí)的頁面的編碼查看結(jié)果 視情況而定。如果是簡(jiǎn)體中文,則能正確顯示,否則,需執(zhí)行表5中的第8步

          Servlet:源文件為JAVA文件,格式是GB2312,源文件中含有“中文”這兩個(gè)漢字

          如果<Compile-charset>=GB2312,<Servlet-charset>=GB2312

          表7 Compile-charset=Servlet-charset=GB2312 時(shí)的變化過程

          序號(hào) 步驟說明 結(jié)果
          1 編寫Servlet源文件,且存為GB2312格式 D6 D0 CE C4
          (D6D0=中 CEC4=文)
          2 用javac –encoding GB2312把JAVA源文件編譯成CLASS文件 E4 B8 AD E6 96 87 (UTF)
          3 運(yùn)行時(shí),先從CLASS文件中用readUTF讀出字符串,在內(nèi)存中的是Unicode編碼 4E 2D 65 87 (Unicode)
          4 根據(jù)Servlet-charset=GB2312把Unicode轉(zhuǎn)化為字節(jié)流 D6 D0 CE C4 (GB2312)
          5 把字節(jié)流輸出到IE中并設(shè)置IE的編碼屬性為Servlet-charset=GB2312 D6 D0 CE C4 (GB2312)
          6 IE用“簡(jiǎn)體中文”查看結(jié)果 “中文”(正確顯示)

          如果<Compile-charset>=ISO8859-1,<Servlet-charset>=ISO8859-1

          表8 Compile-charset=Servlet-charset=ISO8859-1時(shí)的變化過程

          序號(hào) 步驟說明 結(jié)果
          1 編寫Servlet源文件,且存為GB2312格式 D6 D0 CE C4
          (D6D0=中 CEC4=文)
          2 用javac –encoding ISO8859-1把JAVA源文件編譯成CLASS文件 C3 96 C3 90 C3 8E C3 84 (UTF)
          3 運(yùn)行時(shí),先從CLASS文件中用readUTF讀出字符串,在內(nèi)存中的是Unicode編碼 00 D6 00 D0 00 CE 00 C4
          4 根據(jù)Servlet-charset=ISO8859-1把Unicode轉(zhuǎn)化為字節(jié)流 D6 D0 CE C4
          5 把字節(jié)流輸出到IE中并設(shè)置IE的編碼屬性為Servlet-charset=ISO8859-1 D6 D0 CE C4 (GB2312)
          6 IE用“西歐字符”查看結(jié)果 亂碼(原因同表5)
          7 改變IE的頁面編碼為“簡(jiǎn)體中文” “中文”(正確顯示)

          如果不指定Compile-charset或Servlet-charset,其默認(rèn)值均為ISO8859-1。

          當(dāng)Compile-charset=Servlet-charset時(shí),第2步和第4步能互逆,“抵消”,顯示結(jié)果均能正確。讀者可試著寫一下Compile-charset<>Servlet-charset時(shí)的情況,肯定是不正確的。

          當(dāng)輸出對(duì)象是數(shù)據(jù)庫時(shí)

          輸出到數(shù)據(jù)庫時(shí),原理與輸出到瀏覽器也是一樣的。本節(jié)只是Servlet為例,JSP的情況請(qǐng)讀者自行推導(dǎo)。

          假設(shè)有一個(gè)Servlet,它能接收來自客戶端(IE,簡(jiǎn)體中文)的漢字字符串,然后把它寫入到內(nèi)碼為ISO8859-1的數(shù)據(jù)庫中,然后再從數(shù)據(jù)庫中取出這個(gè)字符串,顯示到客戶端。

          表9 輸出對(duì)象是數(shù)據(jù)庫時(shí)的變化過程(1)

          序號(hào) 步驟說明 結(jié)果
          1 在IE中輸入“中文” D6 D0 CE C4 IE
          2 IE把字符串轉(zhuǎn)變成UTF,并送入傳輸流中 E4 B8 AD E6 96 87
          3 Servlet接收到輸入流,用readUTF讀取 4E 2D 65 87(unicode) Servlet
          4 編程者在Servlet中必須把字符串根據(jù)GB2312還原為字節(jié)流 D6 D0 CE C4
          5 編程者根據(jù)數(shù)據(jù)庫內(nèi)碼ISO8859-1生成新的字符串 00 D6 00 D0 00 CE 00 C4
          6 把新生成的字符串提交給JDBC 00 D6 00 D0 00 CE 00 C4
          7 JDBC檢測(cè)到數(shù)據(jù)庫內(nèi)碼為ISO8859-1 00 D6 00 D0 00 CE 00 C4 JDBC
          8 JDBC把接收到的字符串按照ISO8859-1生成字節(jié)流 D6 D0 CE C4
          9 JDBC把字節(jié)流寫入數(shù)據(jù)庫中 D6 D0 CE C4
          10 完成數(shù)據(jù)存儲(chǔ)工作 D6 D0 CE C4 數(shù)據(jù)庫
          以下是從數(shù)據(jù)庫中取出數(shù)的過程
          11 JDBC從數(shù)據(jù)庫中取出字節(jié)流 D6 D0 CE C4 JDBC
          12 JDBC按照數(shù)據(jù)庫的字符集ISO8859-1生成字符串,并提交給Servlet 00 D6 00 D0 00 CE 00 C4 (Unicode)  
          13 Servlet獲得字符串 00 D6 00 D0 00 CE 00 C4 (Unicode) Servlet
          14 編程者必須根據(jù)數(shù)據(jù)庫的內(nèi)碼ISO8859-1還原成原始字節(jié)流 D6 D0 CE C4  
          15 編程者必須根據(jù)客戶端字符集GB2312生成新的字符串 4E 2D 65 87
          (Unicode)
           
          Servlet準(zhǔn)備把字符串輸出到客戶端
          16 Servlet根據(jù)<Servlet-charset>生成字節(jié)流 D6D0 CE C4 Servlet
          17 Servlet把字節(jié)流輸出到IE中,如果已指定<Servlet-charset>,還會(huì)設(shè)置IE的編碼為<Servlet-charset> D6 D0 CE C4
          18 IE根據(jù)指定的編碼或默認(rèn)編碼查看結(jié)果 “中文”(正確顯示) IE

          解釋一下,表中第4第5步和第15第16步是用紅色標(biāo)記的,表示要由編碼 者來作轉(zhuǎn)換。第4、5兩步其實(shí)就是一句話:“new String(source.getBytes("GB2312"), "ISO8859-1")”。第15、16兩步也是一句話:“new String(source.getBytes("ISO8859-1"), "GB2312")”。親愛的讀者,你在這樣編寫代碼時(shí)是否意識(shí)到了其中的每一個(gè)細(xì)節(jié)呢?

          至于客戶端內(nèi)碼和數(shù)據(jù)庫內(nèi)碼為其它值時(shí)的流程,和輸出對(duì)象是系統(tǒng)控制臺(tái)時(shí)的流程,請(qǐng)讀者自己想吧。明白了上述流程的原理,相信你可以輕松地寫出來。

          行文至此,已可告一段落了。終點(diǎn)又回到了起點(diǎn),對(duì)于編程者而言,幾乎是什么影響都沒有。

          因?yàn)槲覀冊(cè)缇捅桓嬷@么做了。

          以下給出一個(gè)結(jié)論,作為結(jié)尾。

          1、 在Jsp文件中,要指定contentType,其中,charset的值要與客戶端瀏覽器所用的字符集一樣;對(duì)于其中的字符串常量,不需做任何內(nèi)碼轉(zhuǎn) 換;對(duì)于字符串變量,要求能根據(jù)ContentType中指定的字符集還原成客戶端能識(shí)別的字節(jié)流,簡(jiǎn)單地說,就是“字符串變量是基于<Jsp- charset>字符集的”;

          2、 在Servlet中,必須用HttpServletResponse.setContentType()設(shè)置charset,且設(shè)置成與客戶端內(nèi)碼一致; 對(duì)于其中的字符串常量,需要在Javac編譯時(shí)指定encoding,這個(gè)encoding必須與編寫源文件的平臺(tái)的字符集一樣,一般說來都是 GB2312或GBK;對(duì)于字符串變量,與JSP一樣,必須“是基于<Servlet-charset>字符集的”。

          posted @ 2008-01-17 14:34 backup2007 閱讀(518) | 評(píng)論 (0)編輯 收藏

          編碼問題2轉(zhuǎn)

          Jsp頁面使用URL編碼傳遞中文參數(shù)的情況下,在參數(shù)的解析過程中會(huì)出現(xiàn)亂碼。由于 java在設(shè)計(jì)的時(shí)候考慮到了國(guó)際化的問題,在java源程序編譯成字節(jié)碼的時(shí)候默認(rèn)使用的是UTF-8編碼。而在web運(yùn)用上,由于不同的瀏覽器向服務(wù) 器發(fā)送的信息采用的編碼方式不同,在由像tomcat之類的服務(wù)器解碼的時(shí)候會(huì)由于編碼方式的不同而產(chǎn)生亂碼,這是一個(gè)會(huì)困擾jsp初學(xué)者很久的問題。以 前在使用struts的時(shí)候不需要處理這些問題,前些天在做一個(gè)簡(jiǎn)單的jsp頁面的時(shí)候碰到這個(gè)問題。經(jīng)過半天的摸索,基本解決了該問題。
          例子中a.jsp頁面通過URL編碼的方式傳遞中文參數(shù),在b.jsp中對(duì)該參數(shù)進(jìn)行解析。
          a.jsp源代碼
          <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
          <title>無標(biāo)題文檔</title>
          </head>
           
          <body>
          <% 
                 String str_test = "華工";
          %>
          <form method=post action="b.jsp?test=<%=java.net.URLEncoder.encode(str_test) %>"> 
                   <input type="submit" value="Submit" name="提交">  
           </form>
           
          </body>
          </html>
           
          b.jsp源代碼
          <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
          <title>無標(biāo)題文檔</title>
          </head>
           
          <body>
           
          <%
                 String str = new String(request.getParameter("test").getBytes("ISO8859_1"));
          %> 
           <BR>
           <%=str %>
          </body>
          </html>
          說明:在使用了java.net.URLEncoder.encode 編碼后,頁面獲取參數(shù)request.getParameter后需要使用ISO8859_1編碼轉(zhuǎn)換。此外,在jsp的字符集聲明中把charset=UTF-8也沒有問題

          posted @ 2008-01-17 14:30 backup2007 閱讀(220) | 評(píng)論 (0)編輯 收藏

          編碼問題1 轉(zhuǎn)

               摘要: HTML:     ……     //實(shí)際上這里的charset=utf-8 也是可以的,因?yàn)樵谥形钠脚_(tái)下     //用了GB2312     JS:     我用了兩個(gè)方法提交:GET 和 POST。 ...  閱讀全文

          posted @ 2008-01-17 14:29 backup2007 閱讀(551) | 評(píng)論 (0)編輯 收藏

          2007年12月24日 #

          vim 常用命令 轉(zhuǎn)

          1、vim顏色太暗,默認(rèn)的尤其是注釋顏色太暗,根本看不清,可通過下述方式設(shè)置
          :colorscheme evening

          2、vim以16進(jìn)制方式編輯文件:
          :%!xxd

          3、用vim格式化代碼
          從別的編輯器里粘貼到vim里的代碼經(jīng)常由于不正常的縮進(jìn)變得格式混亂,有如下兩種方式:
          格式化全文: gg=G
          自動(dòng)縮進(jìn)當(dāng)前行: ==

          4、vim退出后在
          屏幕上保留被編輯文件的內(nèi)容:
          :set t_ti= t_te=

          5、多文件編輯
          打開多個(gè)文件:vim a.c b.c b.c
          切換到下一文件:n
          切換到另一文件:e <文件名如b.c>
          返回上一文件: e#

          橫向分屏:split (不加參數(shù)為分屏當(dāng)前文件,加文件名為以分屏方式打開另一文件)
          豎向分屏:vsplit,與split不同之處在于豎向分屏
          分屏后切換:ctrl+兩次按w

          6、刪除內(nèi)容到緩沖區(qū)
          x為刪除光標(biāo)當(dāng)前字符,而X則刪除光標(biāo)前字符;
          dd為刪除當(dāng)前行;
          nx,nX,ndd則表明刪除的數(shù)目;

          7、拷貝內(nèi)容到緩沖區(qū)
          yy,為拷貝當(dāng)前行到緩沖區(qū);
          yw,為拷貝單個(gè)詞到緩沖區(qū);
          nyy,nyw則表明拷貝的數(shù)目;

          8、移動(dòng)到某一行:
          : n,n為行號(hào)

          nG,n為行號(hào)

          9、visual編輯
          三種進(jìn)入方式:
          v ---- 以字符為單位進(jìn)行選擇
          V ---- 以行為單位進(jìn)行選擇
          ctrl+v ---- 以列塊方式進(jìn)行選擇
          ctrl+c ---- 退出visual編輯方式

          進(jìn)入后對(duì)選擇進(jìn)行的操作有:
          d --- 刪除
          y --- 復(fù)制
          > --- 右移4格
          < --- 左移4格
          ~ --- 大小寫切換
          U --- 變成大寫
          u --- 變成小寫

          posted @ 2007-12-24 18:33 backup2007 閱讀(730) | 評(píng)論 (0)編輯 收藏

          quote : installnation of eclipse for java

          1. 下載文件
          JDK    jdk-1_5_0_06-linux-i586-rpm.bin  http://java.sun.com
          eclipse    eclipse-SDK-3.1.2-linux-gtk.tar.gz  http://www.eclipse.org
          CDT    org.eclipse.cdt-3.0.2-linux.x86.tar.gz  http://www.eclipse.org/cdt

          2. 安裝JDK

          chmod +x jdk-1_5_0_06-linux-i586-rpm.bin
          ./jdk-1_5_0_06-linux-i586-rpm.bin

          設(shè)置環(huán)境變量,編輯/etc/profile,在下面加入

          export JAVA_HOME=/usr/java/jdk1.5.0_06
          export PATH=$JAVA_HOME/bin:$PATH
          CLASSPATH=.:/usr/java/jdk1.5.0_06/lib/tools.jar:$CLASSPATH
          export CLASSPATH

          3. 安裝eclipse

          tar -zxvf eclipse-SDK-3.1.2-linux-gtk.tar.gz

          再移動(dòng)到想要的目錄中,這里為/opt
          編寫一個(gè)執(zhí)行腳本,內(nèi)容如下:

          #eclipse
          #
          export JAVA_HOME=/usr/java/jdk1.5.0_06
          export CLASSPATH=/usr/java/jdk1.5.0_06/lib
          /opt/eclipse/eclipse -vm /usr/java/jdk1.5.0_06/bin/java -data ~/workspace &

          cp eclipse.sh /usr/local/bin
          chmod 755 /usr/local/bin/eclipse.sh

          將eclipse.sh 添加到桌面。桌面上按下鼠標(biāo)右鍵,在彈出菜單中選擇“創(chuàng)建啟動(dòng)器”,在“名稱”中輸入Eclipse、“命令”中填 /usr/local/bin/eclipse.sh,按“確定”,桌面上就有eclipse的快捷方式了,以后可以直接雙擊這個(gè)圖標(biāo)啟動(dòng) Eclipse。

          4. 安裝CDT

          tar -zxvf org.eclipse.cdt-3.0.2-linux.x86.tar.gz

          將相映目錄中的文件cp到eclipse目錄中





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

          先要在linux下安裝好jre,我的jre的安裝目錄是/usr/java/jre1.5

          把下載的文件解壓即可:

          #tar -zxvf eclipse-SDK-3.2-linux-gtk.tar.gz(可以加上絕對(duì)路徑)

          3 為讓每個(gè)用戶都可以執(zhí)行Eclipse,編寫Eclipse.sh腳本:

          #!/bin/bash

          #

          #exe eclipse3.2

          #

          /usr/eclipse/eclipse -vm /usr/java/jre1.5/bin/java -data ~/workspace &

          # -vm 參數(shù)用以指定使用哪一個(gè) jvm 來執(zhí)行Eclipse

          # -date參數(shù)用以指定Eclipse的數(shù)據(jù)目錄。在此指定其存在用戶根目錄(~)下的workspace目錄中

          eclipse.sh 復(fù)制到/usr/local/bin中,并為它加上權(quán)限755;現(xiàn)在執(zhí)行 eclipse.sh 即可啟動(dòng) Eclipse

          4桌面上建立快捷方式:

          在桌面上按下鼠標(biāo)右鍵,在彈出菜單中選擇“新增啟動(dòng)”,之后分別在“名稱”中輸入Eclipse3.2,“命令”中填 /usr/local/bin/eclipse.sh,然后再為它隨便找個(gè)喜歡的圖標(biāo)(我用的是/opt/eclipse/icon.xpm;再后按“確定”,桌面上就有eclipse的快捷方式了,以后可以直接雙擊這個(gè)圖標(biāo)啟動(dòng)Eclipse

          posted @ 2007-12-24 17:21 backup2007 閱讀(313) | 評(píng)論 (0)編輯 收藏

          轉(zhuǎn) eclipse3.3 + minGW for c/c++ development

          本設(shè)置的主要目的是在最新版的eclipse3.3(Europa)上開發(fā)標(biāo)準(zhǔn)C/C++程序,而不去使用VC++。

          因?yàn)镃DT只提供了開發(fā)C/C++項(xiàng)目的IDE,所以我們需要安裝MinGW(即 Minimalist GNU For Windows。它是一些頭文件和端口庫的集合,該集合允許人們?cè)跊]有第三方動(dòng)態(tài)鏈接庫的情況下使用 GCC(GNU Compiler C)產(chǎn)生 Windows32 程序。)和MSYS(Minimal GNU(POSIX)system on Windows,是一個(gè)小型的GNU環(huán)境,包括基本的bash,make等等。是Windows下最優(yōu)秀的GNU環(huán)境。):
          下載Automated MinGW Installer:MinGW-5.1.3.exe(注意這只是個(gè)在線安裝程序),執(zhí)行MinGW-5.1.3.exe;
          在choose package向?qū)ы摚x擇Current項(xiàng);
          在choose components向?qū)ы摚x中MinGW base tools和g++ compiler項(xiàng);
          在choose install location向?qū)ы摚O(shè)置安裝目錄,為說明方便,這里假設(shè)路徑為d:\MinGW;
          等待MinGW在線安裝完成。
          接下來,在下載MinGW的同一頁面,我們下載MSYS (Minimal System):Current Release: msys-1.0.10,執(zhí)行MSYS-1.0.10.exe;
          在安裝MSYS過程中,假定我們安裝路徑為D:\msys;
          在安裝MSYS過程中,會(huì)出現(xiàn)控制臺(tái)界面(類DOS窗口)的三個(gè)詢問,分別鍵入y、y、D:/MinGW(MinGW安裝路徑)即可。
          安裝好MinGW和MYYS后,需要配置一下系統(tǒng)的環(huán)境變量,右鍵點(diǎn)擊“我的電腦”->屬性->高級(jí)->環(huán)境變量,在系統(tǒng)變量中進(jìn)行如下操作:
          編輯PATH變量,在開頭處加入D:\MinGW\bin;D:\msys\1.0\bin;
          添加LIBRARY_PATH變量,值為D:\MinGW\lib
          添加C_INCLUDE_PATH變量,值為D:\MinGW\include
          添加CPLUS_INCLUDE_PATH變量,值為D:\MinGW\include\c++\3.4.2;D:\MinGW\include\c++\3.4.2\mingw32;D:\MinGW\include\c++\3.4.2\backward;D:\MinGW\include
          打開系統(tǒng)開始菜單->附件->命令提示符,在里面輸入make –version或gcc –version并回車,如果出現(xiàn)版本信息,則配置成功。
          如果你的系統(tǒng)上沒有安裝jre,去下載最新版的jre5.0,并進(jìn)行安裝。
          接下來這步,我們先進(jìn)入到http://www.eclipse.org/downloads/頁面,最好直接下載Eclipse IDE for C/C++ Developers - Windows (62 MB) 這個(gè)版本,基本上下載完后就可以正常使用。

          如果你已經(jīng)有了eclipse3.3但需要單獨(dú)安裝CDT4的話,請(qǐng)參見這里CDT Europa Releases Update Site,里面說的很清楚,可以在eclipse的help->Software Updates -> Find and Install -> Search for new Features to Install中,加入一個(gè)site http://download.eclipse.org/tools/cdt/releases/europa升級(jí)即可。

          值得注意的是,不要直接下載cdt-master-4.0.0.zip,并且解壓縮后覆蓋到eclipse目錄下!,否則雖然可以調(diào)出CDT界面,但編譯和執(zhí)行會(huì)有問題。

          最后,我們啟動(dòng)eclipse并進(jìn)行一個(gè)測(cè)試,創(chuàng)建一個(gè)C++ Project,選擇Executable->Hello World C++ Project,toolchain選擇MinGW GCC。創(chuàng)建后build它即可。

          posted @ 2007-12-24 11:51 backup2007 閱讀(1294) | 評(píng)論 (0)編輯 收藏

          2007年12月13日 #

          bootSect.S 文件中的include小問題

          在 Linux 啟動(dòng)過程中,最開始加載的程序就是 bootSect.S 文件.

          其中第一行是一個(gè)include 語句:#include <asm/boot.h>
          而當(dāng)我去查看boot.h的時(shí)候,發(fā)現(xiàn)它的真正位置在 "include/asm-i386/boot.h" 而不是 "include/ asm/boot.h"

          這讓我很不解,查網(wǎng)上資料也沒有解答, 打開makefile文件,仔細(xì)看了一下,終于找到原因:

          在makefile 中有這么一段:

          symlinks:
              rm 
          -f include/asm
              ( cd include ; ln 
          -sf asm-$(ARCH) asm)
              @if [ 
          ! -d include/linux/modules ]; then 
                  mkdir include
          /linux/modules; 
              fi

          很明顯,首先刪除了 asm文件夾,然后 在include 下面做了一個(gè)軟連接: ln -sf asm-$(ARCH)  asm

          這里的ARCH明顯是系統(tǒng)相關(guān)的環(huán)境變量了,比如在i386機(jī)器上就是代表i386了。這樣asm-i386就轉(zhuǎn)成了asm.

          posted @ 2007-12-13 18:23 backup2007 閱讀(401) | 評(píng)論 (0)編輯 收藏

          2007年12月12日 #

          putty 登陸unix-center ubuntu服務(wù)器 輸入中文

          putty 登陸unix-center ubuntu服務(wù)器默認(rèn)是無法輸入中文的,
          服務(wù)器上的ubuntu默認(rèn)是GBK字符集,
          把putty 的font改成宋體,chinese_GB2312字符集,
          transition 里面保留默認(rèn)Use font encoding 。
          重新登陸即可。

          登陸 solaris 服務(wù)器我還沒找到輸入中文的方法。

          [在~/ 建立.profile 建立環(huán)境變量]

          posted @ 2007-12-12 14:10 backup2007 閱讀(798) | 評(píng)論 (0)編輯 收藏

          2007年10月15日 #

          J2ee 程序員 需要了解的Linux知識(shí)

          版權(quán)聲明:如有轉(zhuǎn)載請(qǐng)求,請(qǐng)注明出處:http://blog.csdn.net/yzhz

                   一般大型J2EE應(yīng)用都在建構(gòu)在linux環(huán)境下的。開發(fā)環(huán)境下我們可以通過samba映射成本地的網(wǎng)絡(luò)驅(qū)動(dòng)器,直接在windows環(huán)境下進(jìn)行編程調(diào) 試。但是最后的發(fā)布還是要到linux環(huán)境,同時(shí)我們對(duì)網(wǎng)上web服務(wù)器和數(shù)據(jù)庫服務(wù)器的應(yīng)用管理(比如自動(dòng)腳本發(fā)布等),應(yīng)用監(jiān)控(web服務(wù)是否正 常、mysql數(shù)據(jù)庫的使用情況)、系統(tǒng)監(jiān)控(監(jiān)控磁盤空間的使用情況等)都要求程序員熟悉必要的linux知識(shí)。
                  當(dāng)然程序員不必對(duì)整個(gè)linux系統(tǒng)樣樣精通。下面根據(jù)本人開發(fā)的經(jīng)驗(yàn),列出程序員基本需要掌握的linux知識(shí)。

          一、linux的基本命令
          1、用戶管理
          userdel    刪除用戶帳號(hào)
          useradd    增加用戶賬號(hào)
          su         改變當(dāng)前用戶的ID

          2、文件目錄管理
          ls         瀏覽目錄,查看當(dāng)前目錄下的文件和文件名
          chmod      修改文件權(quán)限
          chown      改變文件所有者
          cp         復(fù)制文件
          cd         改變當(dāng)前目錄
          mv         重命名文件或移動(dòng)文件
          rm         刪除文件或者目錄
          pwd        當(dāng)前目錄
          scp        遠(yuǎn)程拷貝
          alias      別名

          3、其他命令
          ln         在文件之間建立鏈接
          tail       輸出文件內(nèi)容后面的部分,一般我們會(huì)通過tail -f 實(shí)時(shí)查看當(dāng)前程序打印的日志。
          type       查看一個(gè)命令所在路徑
          wc         查看行數(shù)
          grep       在文件內(nèi)容中查找
          find       查找文件
          date       查看日期
          crontab     制定計(jì)劃任務(wù),通常用于系統(tǒng)監(jiān)控。
          df          查看磁盤剩余空間,你最好在crontab中寫個(gè)腳本監(jiān)控磁盤的空間。超過90%就給相關(guān)的人員發(fā)email。
          ps          查看進(jìn)程狀態(tài)
          top         查看CPU的使用率
          kill        終止進(jìn)程
          killall     java程序員最喜歡用killall -9 java吧
          w           查看登錄用戶和他們正在做什么,也可以看看系統(tǒng)的load。load太高,就該找找原因了。
          who         查看當(dāng)前用戶的便當(dāng)情況
          tar         解壓或壓縮文件
          echo        控制臺(tái)輸出
          wget        http訪問
          rpm         rpm包管理

          4、重定向、管道
          5、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤
          6、使用"屏蔽一個(gè)特殊字符的含義
          7、正則表達(dá)式

          二、熟練掌握vim編輯器。

          三、liunx環(huán)境下shell腳本、perl腳本的編寫
          為了對(duì)網(wǎng)上服務(wù)器應(yīng)用進(jìn)行管理,通常需要編寫一些腳本。
          腳本的編寫重點(diǎn)掌握下面幾點(diǎn):
          1、理解雙引號(hào)、單引號(hào)、反引號(hào)的含義。
          2、反斜線的使用。
          3、shell腳本賦值語句左邊的變量名不要加上$,常寫perl腳本的常犯此錯(cuò)誤。
          4、字符串比較長(zhǎng),含有空格的時(shí)候,作為一個(gè)參數(shù)時(shí)腳本出錯(cuò),用雙引號(hào)把字符串括起來。
          5、掌握好awk和sed的用法。

          四、基本軟件包的安裝
          apache、resin、mysql
          一般的步驟就是:
          configure
          make
          make install

          五、相關(guān)網(wǎng)站
          下面的網(wǎng)站是比較優(yōu)秀的linux網(wǎng)站,可以去看看。
          http://www.linuxforum.net/



          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=198050

          posted @ 2007-10-15 18:11 backup2007 閱讀(437) | 評(píng)論 (0)編輯 收藏

          2007年10月14日 #

          debian JDK安裝小記

          網(wǎng)上不外乎兩種方法,一個(gè)是用deb包的,確實(shí)方便,一個(gè)是用傳統(tǒng)方法的,更加通用。
          我兩個(gè)都試過,但是在傳統(tǒng)方式安裝中遇到了小問題,記錄一下。

          網(wǎng)上的教程說,修改/etc/profile 添加環(huán)境變量,但是這個(gè)變量在重新開啟終端之后就失效了,每次重新登錄后都會(huì)失效,
          必須用 $source /etc/profile 加載才能生效。
          baidu了一下,發(fā)現(xiàn)/etc/profile是系統(tǒng)環(huán)境變量,在它之前會(huì)先加載用戶目錄下的.bashrc文件,那么我作修改:
          在~/.bashrc末尾添加  source /etc/profile ,然后$source ~/.bashrc 使之生效,這樣以后重新打開終端也可生效了。
          OK.

          posted @ 2007-10-14 16:24 backup2007 閱讀(931) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題  下一頁
          主站蜘蛛池模板: 上思县| 华安县| 当涂县| 芦溪县| 子洲县| 太和县| 滕州市| 荆门市| 凭祥市| 开江县| 兴安县| 甘孜县| 屯昌县| 泰和县| 阜城县| 且末县| 柏乡县| 武鸣县| 桂阳县| 新绛县| 屏山县| 淮南市| 出国| 定日县| 乐平市| 米林县| 镇坪县| 壶关县| 广汉市| 夏津县| 胶州市| 闽清县| 虎林市| 平罗县| 平果县| 临潭县| 河南省| 商南县| 疏勒县| 阜新| 汽车|