1. 程式人生 > >vbs 轉碼 gb2312轉換為UTF-8編碼的函式

vbs 轉碼 gb2312轉換為UTF-8編碼的函式

<%
1、'UTF轉GB---將UTF8編碼文字轉換為GB編碼文字
function UTF2GB(UTFStr)

for Dig=1 to len(UTFStr)
  '如果UTF8編碼文字以%開頭則進行轉換
  if mid(UTFStr,Dig,1)="%" then
     'UTF8編碼文字大於8則轉換為漢字
    if len(UTFStr) >= Dig+8 then
       GBStr=GBStr & ConvChinese(mid(UTFStr,Dig,9))
       Dig=Dig+8
    else
      GBStr=GBStr & mid(UTFStr,Dig,1)
    end if
  else
     GBStr=GBStr & mid(UTFStr,Dig,1)
  end if
next
UTF2GB=GBStr
end function

'UTF8編碼文字將轉換為漢字
function ConvChinese(x)
   A=split(mid(x,2),"%")
   i=0
   j=0
  for i=0 to ubound(A)
     A(i)=c16to2(A(i))
  next
  for i=0 to ubound(A)-1
    DigS=instr(A(i),"0")
    Unicode=""
    for j=1 to DigS-1
      if j=1 then
        A(i)=right(A(i),len(A(i))-DigS)
        Unicode=Unicode & A(i)
      else
         i=i+1
         A(i)=right(A(i),len(A(i))-2)
         Unicode=Unicode & A(i)
      end if
    next

    if len(c2to16(Unicode))=4 then
       ConvChinese=ConvChinese & chrw(int("&H" & c2to16(Unicode)))
    else
       ConvChinese=ConvChinese & chr(int("&H" & c2to16(Unicode)))
    end if
  next
end function

'二進位制程式碼轉換為十六進位制程式碼
function c2to16(x)
   i=1
   for i=1 to len(x) step 4
      c2to16=c2to16 & hex(c2to10(mid(x,i,4)))
   next
end function

'二進位制程式碼轉換為十進位制程式碼
function c2to10(x)
   c2to10=0
   if x="0" then exit function
     i=0
   for i= 0 to len(x) -1
      if mid(x,len(x)-i,1)="1" then c2to10=c2to10+2^(i)
   next
end function

'十六進位制程式碼轉換為二進位制程式碼
function c16to2(x)
    i=0
    for i=1 to len(trim(x))
      tempstr= c10to2(cint(int("&h" & mid(x,i,1))))
      do while len(tempstr)<4
         tempstr="0" & tempstr
      loop
      c16to2=c16to2 & tempstr
   next
end function

'十進位制程式碼轉換為二進位制程式碼
function c10to2(x)
   mysign=sgn(x)
   x=abs(x)
   DigS=1
   do
      if x<2^DigS then
        exit do
      else
        DigS=DigS+1
      end if
   loop
   tempnum=x

   i=0
   for i=DigS to 1 step-1
      if tempnum>=2^(i-1) then
         tempnum=tempnum-2^(i-1)
         c10to2=c10to2 & "1"
      else
         c10to2=c10to2 & "0"
      end if
   next
   if mysign=-1 then c10to2="-" & c10to2
end function

2、'GB轉UTF8--將GB編碼文字轉換為UTF8編碼文字

Function toUTF8(szInput)
    Dim wch, uch, szRet
    Dim x
    Dim nAsc, nAsc2, nAsc3
    '如果輸入引數為空,則退出函式
    If szInput = "" Then
        toUTF8 = szInput
        Exit Function
    End If
    '開始轉換
     For x = 1 To Len(szInput)
        '利用mid函式分拆GB編碼文字
        wch = Mid(szInput, x, 1)
        '利用ascW函式返回每一個GB編碼文字的Unicode字元程式碼
        '注:asc函式返回的是ANSI 字元程式碼,注意區別
        nAsc = AscW(wch)
        If nAsc < 0 Then nAsc = nAsc + 65536
   
        If (nAsc And &HFF80) = 0 Then
            szRet = szRet & wch
        Else
            If (nAsc And &HF000) = 0 Then
                uch = "%" & Hex(((nAsc / 2 ^ 6)) Or &HC0) & Hex(nAsc And &H3F Or &H80)
                szRet = szRet & uch
            Else
               'GB編碼文字的Unicode字元程式碼在0800 - FFFF之間採用三位元組模版
                uch = "%" & Hex((nAsc / 2 ^ 12) Or &HE0) & "%" & _
                            Hex((nAsc / 2 ^ 6) And &H3F Or &H80) & "%" & _
                            Hex(nAsc And &H3F Or &H80)
                szRet = szRet & uch
            End If
        End If
    Next
       
    toUTF8 = szRet
End Function

3、'GB轉unicode---將GB編碼文字轉換為unicode編碼文字

function chinese2unicode(Str)
  dim i
  dim Str_one
  dim Str_unicode
  if(isnull(Str)) then
     exit function
  end if
  for i=1 to len(Str)
    Str_one=Mid(Str,i,1)
    Str_unicode=Str_unicode&chr(38)
    Str_unicode=Str_unicode&chr(35)
    Str_unicode=Str_unicode&chr(120)
    Str_unicode=Str_unicode& Hex(ascw(Str_one))
    Str_unicode=Str_unicode&chr(59)
  next
  chinese2unicode=Str_unicode
end function  

4、'URL解碼
Function URLDecode(enStr)
dim deStr
dim c,i,v
deStr=""
for i=1 to len(enStr)
  c=Mid(enStr,i,1)
  if c="%" then
   v=eval("&h"+Mid(enStr,i+1,2))
   if v<128 then
    deStr=deStr&chr(v)
    i=i+2
   else
    if isvalidhex(mid(enstr,i,3)) then
     if isvalidhex(mid(enstr,i+3,3)) then
      v=eval("&h"+Mid(enStr,i+1,2)+Mid(enStr,i+4,2))
      deStr=deStr&chr(v)
      i=i+5
     else
      v=eval("&h"+Mid(enStr,i+1,2)+cstr(hex(asc(Mid(enStr,i+3,1)))))
      deStr=deStr&chr(v)
      i=i+3
     end if
    else
     destr=destr&c
    end if
   end if
  else
   if c="+" then
    deStr=deStr&" "
   else
    deStr=deStr&c
   end if
  end if
next
URLDecode=deStr
end function

'判斷是否為有效的十六進位制程式碼
function isvalidhex(str)
dim c
isvalidhex=true
str=ucase(str)
if len(str)<>3 then isvalidhex=false:exit function
if left(str,1)<>"%" then isvalidhex=false:exit function
  c=mid(str,2,1)
if not (((c>="0") and (c<="9")) or ((c>="A") and (c<="Z"))) then isvalidhex=false:exit function
  c=mid(str,3,1)
if not (((c>="0") and (c<="9")) or ((c>="A") and (c<="Z"))) then isvalidhex=false:exit function
end function
%>

 參考資料

GB2312 字符集

GB2312又稱為GB2312-80字符集,全稱為《資訊交換用漢字編碼字符集·基本集》,由原中國國家標準總局釋出,1981年5月1日實施,是中國國家標準的簡體中文字符集。它所收錄的漢字已經覆蓋99.75%的使用頻率,基本滿足了漢字的計算機處理需要。在中國大陸和新加坡獲廣泛使用。

GB2312收錄簡化漢字及一般符號、序號、數字、拉丁字母、日文假名、希臘字母、俄文字母、漢語拼音符號、漢語注音字母,共 7445 個圖形字元。其中包括6763個漢字,其中一級漢字3755個,二級漢字3008個;包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西裡爾字母在內的682個全形字元。

GB2312中對所收漢字進行了“分割槽”處理,每區含有94個漢字/符號。這種表示方式也稱為區位碼。

它是用雙位元組表示的,兩個位元組中前面的位元組為第一位元組,後面的位元組為第二位元組。習慣上稱第一位元組為“高位元組” ,而稱第二位元組為“低位元組”。“高位位元組”使用了0xA1-0xF7(把01-87區的區號加上0xA0),“低位位元組”使用了0xA1-0xFE(把01-94加上0xA0)。

以GB2312字符集的第一個漢字“啊”字為例,它的區號16,位號01,則區位碼是1601,在大多數計算機程式中,高位元組和低位元組分別加0xA0得到程式的漢字處理編碼0xB0A1。計算公式是:0xB0=0xA0+16, 0xA1=0xA0+1。

GBK字符集
GBK字符集是GB2312的擴充套件(K),GBK1.0收錄了21886個符號,它分為漢字區和圖形符號區,漢字區包括21003個字元。GBK字符集主要擴充套件了繁體中文字的支援。


BIG5 字符集

BIG5又稱大五碼或五大碼,1984年由臺灣財團法人資訊工業策進會和五間軟體公司巨集碁 (Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、大眾 (FIC)創立,故稱大五碼。Big5碼的產生,是因為當時臺灣不同廠商各自推出不同的編碼,如倚天碼、IBM PS55、王安碼等,彼此不能相容;另一方面,臺灣政府當時尚未推出官方的漢字編碼,而中國大陸的GB2312編碼亦未有收錄繁體中文字。

Big5字符集共收錄13,053箇中文字,該字符集在中國臺灣使用。耐人尋味的是該字符集重複地收錄了兩個相同的字:“兀”(0xA461及0xC94A)、“嗀”(0xDCD1及0xDDFC)。

Big5碼使用了雙位元組儲存方法,以兩個位元組來編碼一個字。第一個位元組稱為“高位位元組”,第二個位元組稱為“低位位元組”。高位位元組的編碼範圍0xA1-0xF9,低位位元組的編碼範圍0x40-0x7E及0xA1-0xFE。

儘管Big5碼內包含一萬多個字元,但是沒有考慮社會上流通的人名、地名用字、方言用字、化學及生物科等用字,沒有包含日文平假名及片假字母。

例如臺灣視“著”為“著”的異體字,故沒有收錄“著”字。康熙字典中的一些部首用字(如“亠”、“疒”、“辵”、“癶”等)、常見的人名用字(如“堃”、“煊”、“栢”、“喆”等) 也沒有收錄到Big5之中。


GB18030 字符集

GB18030的全稱是GB18030-2000《資訊交換用漢字編碼字符集基本集的擴充》,是我國政府於2000年3月17日釋出的新的漢字編碼國家標準,2001年8月31日後在中國市場上釋出的軟體必須符合本標準。GB 18030字符集標準的出臺經過廣泛參與和論證,來自國內外知名資訊科技行業的公司,資訊產業部和原國家質量技術監督局聯合實施。

GB 18030字符集標準解決漢字、日文假名、朝鮮語和中國少數民族文字組成的大字符集計算機編碼問題。該標準的字元總編碼空間超過150萬個編碼位,收錄了27484個漢字,覆蓋中文、日文、朝鮮語和中國少數民族文字。滿足中國大陸、香港、臺灣、日本和韓國等東亞地區資訊交換多文種、大字量、多用途、統一編碼格式的要求。並且與Unicode 3.0版本相容,填補Unicode擴充套件字元字彙“統一漢字擴充套件A”的內容。並且與以前的國家字元編碼標準(GB2312,GB13000.1)相容。

編碼方法:
GB 18030標準採用單位元組、雙位元組和四位元組三種方式對字元編碼。單位元組部分使用0×00至0×7F碼(對應於ASCII碼的相應碼)。雙位元組部分,首位元組碼從0×81至0×FE,尾位元組碼位分別是0×40至0×7E和0×80至0×FE。四位元組部分採用GB/T 11383未採用的0×30到0×39作為對雙位元組編碼擴充的字尾,這樣擴充的四位元組編碼,其範圍為0×81308130到0×FE39FE39。其中第一、三個位元組編碼碼位均為0×81至0×FE,第二、四個位元組編碼碼位均為0×30至0×39。

按照程式設計師的稱呼,GB2312、GBK到GB18030都屬於雙位元組字符集 (DBCS)。

接著是國際通用的unicode字符集

Unicode字符集(簡稱為UCS)

1.名稱的由來

Unicode字符集編碼是(Universal Multiple-Octet Coded Character Set) 通用多八位編碼字符集的簡稱,支援世界上超過650種語言的國際字符集。Unicode允許在同一伺服器上混合使用不同語言組的不同語言。它是由一個名為 Unicode 學術學會(Unicode Consortium)的機構制訂的字元編碼系統,支援現今世界各種不同語言的書面文字的交換、處理及顯示。該編碼於1990年開始研發,1994年正式公佈,最新版本是2005年3月31日的Unicode 4.1.0。Unicode是一種在計算機上使用的字元編碼。它為每種語言中的每個字元設定了統一併且唯一的二進位制編碼,以滿足跨語言、跨平臺進行文字轉換、處理的要求。

2.編碼方法

Unicode 標準始終使用十六進位制數字,而且在書寫時在前面加上字首“U+”,例如字母“A”的編碼為 004116 。所以“A”的編碼書寫為“U+0041”。

3.UTF-8 編碼
UTF-8是Unicode的其中一個使用方式。 UTF是 Unicode Translation Format,即把Unicode轉做某種格式的意思。

UTF-8便於不同的計算機之間使用網路傳輸不同語言和編碼的文字,使得雙位元組的Unicode能夠在現存的處理單位元組的系統上正確傳輸。

UTF-8使用可變長度位元組來儲存 Unicode字元,例如ASCII字母繼續使用1位元組儲存,重音文字、希臘字母或西裡爾字母等使用2位元組來儲存,而常用的漢字就要使用3位元組。輔助平面字元則使用4位元組。

4.UTF-16 和 UTF-32 編碼
UTF-32、UTF-16 和 UTF-8 是 Unicode 標準的編碼字符集的字元編碼方案,UTF-16 使用一個或兩個未分配的 16 位程式碼單元的序列對 Unicode 程式碼點進行編碼;UTF-32 即將每一個 Unicode 程式碼點表示為相同值的 32 位整數

通過一個問題了解unicode編碼

問題:使用Windows記事本的“另存為”,可以在ANSI、GBK、Unicode、Unicode big endian和UTF-8這幾種編碼方式間相互轉換。同樣是txt檔案,Windows怎樣識別編碼方式的呢?
我很早前就發現Unicode、Unicode big endian和UTF-8編碼的txt檔案的開頭會多出幾個位元組,分別是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但這些標記是基於什麼標準呢?

答案:

ANSI字符集定義:ASCII字符集,以及由此派生併兼容的字符集,如:GB2312,正式的名稱為MBCS(Multi-Byte Chactacter System,多位元組字元系統),通常也稱為ANSI字符集。

UNICODE 與 UTF8、UTF16

由於每種語言都制定了自己的字符集,導致最後存在的各種字符集實在太多,在國際交流中要經常轉換字符集非常不便。因此,產生了Unicode字符集,它固定使用16 bits(兩個位元組)來表示一個字元,共可以表示65536個字元
標準的 Unicode 稱為UTF-16(UTF:UCS Transformation Format )。後來為了雙位元組的Unicode能夠在現存的處理單位元組的系統上正確傳輸,出現了UTF-8,使用類似MBCS的方式對Unicode進行編碼。(Unicode字符集有多種編碼形式)
例如"連通"兩個字的Unicode標準編碼UTF-16 (big endian)為:DE 8F 1A 90
而其UTF-8編碼為:E8 BF 9E E9 80 9A

當一個軟體開啟一個文字時,它要做的第一件事是決定這個文字究竟是使用哪種字符集的哪種編碼儲存的。軟體一般採用三種方式來決定文字的字符集和編碼:
檢測檔案頭標識,提示使用者選擇,根據一定的規則猜測
最標準的途徑是檢測文字最開頭的幾個位元組,開頭位元組 Charset/encoding,如下表:
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.


1、big endian和little endian
big endian和little endian是CPU處理多位元組數的不同方式。例如“漢”字的Unicode編碼是6C49。那麼寫到檔案裡時,究竟是將6C寫在前面,還是將49寫在前面?如果將6C寫在前面,就是big endian。還是將49寫在前面,就是little endian。
“endian”這個詞出自《格列佛遊記》。小人國的內戰就源於吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開,由此曾發生過六次叛亂,其中一個皇帝送了命,另一個丟了王位。
我們一般將endian翻譯成“位元組序”,將big endian和little endian稱作“大尾”和“小尾”。

2、字元編碼、內碼,順帶介紹漢字編碼
字元必須編碼後才能被計算機處理。計算機使用的預設編碼方式就是計算機的內碼。早期的計算機使用7位的ASCII編碼,為了處理漢字,程式設計師設計了用於簡體中文的GB2312和用於繁體中文的big5。
GB2312(1980年)一共收錄了7445個字元,包括6763個漢字和682個其它符號。漢字區的內碼範圍高位元組從B0-F7,低位元組從A1-FE,佔用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。
GB2312支援的漢字太少。1995年的漢字擴充套件規範GBK1.0收錄了21886個符號,它分為漢字區和圖形符號區。漢字區包括21003個字元。2000年的GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。現在的PC平臺必須支援GB18030,對嵌入式產品暫不作要求。所以手機、MP3一般只支援GB2312。
從ASCII、GB2312、GBK到GB18030,這些編碼方法是向下相容的,即同一個字元在這些方案中總是有相同的編碼,後面的標準支援更多的字元。在這些編碼中,英文和中文可以統一地處理。區分中文編碼的方法是高位元組的最高位不為0。按照程式設計師的稱呼,GB2312、GBK到GB18030都屬於雙位元組字符集 (DBCS)。
有的中文Windows的預設內碼還是GBK,可以通過GB18030升級包升級到GB18030。不過GB18030相對GBK增加的字元,普通人是很難用到的,通常我們還是用GBK指代中文Windows內碼。
這裡還有一些細節:
GB2312的原文還是區位碼,從區位碼到內碼,需要在高位元組和低位元組上分別加上A0。
在DBCS中,GB內碼的儲存格式始終是big endian,即高位在前。
GB2312的兩個位元組的最高位都是1。但符合這個條件的碼位只有128*128=16384個。所以GBK和GB18030的低位元組最高位都可能不是1。不過這不影響DBCS字元流的解析:在讀取DBCS字元流時,只要遇到高位為1的位元組,就可以將下兩個位元組作為一個雙位元組編碼,而不用管低位元組的高位是什麼。

3、Unicode、UCS和UTF(UCS Transformation Format)
前面提到從ASCII、GB2312、GBK到GB18030的編碼方法是向下相容的。而Unicode只與ASCII相容(更準確地說,是與ISO-8859-1相容),與GB碼不相容。例如“漢”字的Unicode編碼是6C49,而GB碼是BABA。

UCS規定了怎麼用多個位元組表示各種文字。而怎樣傳輸這些編碼,是由UTF(UCS Transformation Format)規範規定的!常見的UTF規範包括UTF-8、UTF-7、UTF-16。

4、UTF的位元組序和BOM
UTF-8以位元組為編碼單元,沒有位元組序的問題。UTF-16以兩個位元組為編碼單元,在解釋一個UTF-16文字前,首先要弄清楚每個編碼單元的位元組序。例如收到一個“奎”的Unicode編碼是594E,“乙”的Unicode編碼是4E59。如果我們收到UTF-16位元組流“594E”,那麼這是“奎”還是“乙”?
Unicode規範中推薦的標記位元組順序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一個有點小聰明的想法:
在UCS編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字元,它的編碼是FEFF。而FFFE在UCS中是不存在的字元,所以不應該出現在實際傳輸中。UCS規範建議我們在傳輸位元組流前,先傳輸字元"ZERO WIDTH NO-BREAK SPACE"。
這樣如果接收者收到FEFF,就表明這個位元組流是Big-Endian的;如果收到FFFE,就表明這個位元組流是Little-Endian的。因此字元"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。
UTF-8不需要BOM來表明位元組順序,但可以用BOM來表明編碼方式。字元"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF(讀者可以用我們前面介紹的編碼方法驗證一下)。所以如果接收者收到以EF BB BF開頭的位元組流,就知道這是UTF-8編碼了。
Windows就是使用BOM來標記文字檔案的編碼方式的。


寫到這裡對編碼有了大致的瞭解了,就可以理解網上一些文章的話了,比如有一篇很流行的文章《URL編碼與SQL注射》裡面有一段是這麼說的:

其實url編碼就是一個字元ascii碼的十六進位制。不過稍微有些變動,需要在前面加上“%”。比如“/”,它的ascii碼是92,92的十六進位制是5c,所以“/”的url編碼就是%5c。那麼漢字的url編碼呢?很簡單,看例子:“胡”的ascii碼是-17670,十六進位制是BAFA,url編碼是“%BA%FA”。呵呵,知道怎麼轉換的了吧。


這得從ASCII說起,擴充套件的ASCII字符集採用8bit255個字元顯然不夠用,於是各個國家紛紛制定了自己的文字編碼規範,其中中文的文字編碼規範叫做“GB2312-80”(就是GB2312),它是和ASCII相容的一種編碼規範,其實就是用擴充套件ASCII沒有真正標準化這一點,把一箇中文字元用兩個擴充套件ASCII字元來表示。文中說的的中文ASCII碼實際上就是簡體中文的編碼2312GB!它把ASCII又擴充了一個位元組,由於高位的第一位是0,所以會出現負數的形式,url編碼就是將漢字的這個GB2312編碼轉化成UTF-8的編碼並且每8位即一個位元組前面加上%符號表示。

那為何UTF-8是進行網路的規範傳輸編碼呢?

在Unicode裡,所有的字元被一視同仁。漢字不再使用“兩個擴充套件ASCII”,而是使用“1個Unicode”,注意,現在的漢字是“一個字元”了,於是,拆字、統計字數這些問題也就自然而然的解決了。但是,這個世界不是理想的,不可能在一夜之間所有的系統都使用Unicode來處理字元,所以Unicode在誕生之日,就必須考慮一個嚴峻的問題:和ASCII字符集之間的不相容問題。

我們知道,ASCII字元是單個位元組的,比如“A”的ASCII是65。而Unicode是雙位元組的,比如“A”的Unicode是0065,這就造成了一個非常大的問題:以前處理ASCII的那套機制不能被用來處理Unicode了

另一個更加嚴重的問題是,C語言使用'/0'作為字串結尾,而Unicode裡恰恰有很多字元都有一個位元組為0,這樣一來,c語言的字串函式將無法正常處理Unicode,除非把世界上所有用C寫的程式以及他們所用的函式庫全部換掉

於是,比Unicode更偉大的東東誕生了,之所以說它更偉大是因為它讓Unicode不再存在於紙上,而是真實的存在於我們大家的電腦中。那就是:UTF

UTF= UCS Transformation Format UCS轉換格式,它是將Unicode編碼規則和計算機的實際編碼對應起來的一個規則。現在流行的UTF有2種:UTF-8和UTF-16

其中UTF-16和上面提到的Unicode本身的編碼規範是一致的,這裡不多說了。而UTF-8不同,它定義了一種“區間規則”,這種規則可以和ASCII編碼保持最大程度的相容,這樣做的好處是壓縮了字元在西歐一些國家的記憶體消耗,減少了不必要的資源浪費,這在實際應用中是非常有必要的。

UTF-8有點類似於Haffman編碼,它將Unicode編碼為:
00000000-0000007F的字元,用單個位元組來表示;

00000080-000007FF的字元用兩個位元組表示 (中文的編碼範圍)

00000800-0000FFFF的字元用3位元組表示

因為目前為止Unicode-16規範沒有指定FFFF以上的字元,所以UTF-8最多是使用3個位元組來表示一個字元。但理論上來說,UTF-8最多需要用6位元組表示一個字元。

在UTF-8裡,英文字元仍然跟ASCII編碼一樣,因此原先的函式庫可以繼續使用。而中文的編碼範圍是在0080-07FF之間,因此是2個位元組表示(但這兩個位元組和GB編碼的兩個位元組是不同的)。


看看編碼之多:ANSI,AscII,GB2312,GBK,BIG5,GB18030,Unicode,UCS(就是unicode)Utf-8,utf-16,utf-32 整整10種編碼~,算是夠複雜了
可是這還僅僅是個開始,應用方面變化無窮,不過現在看到這些東西起碼再不會頭大了!呼呼~


哦,漏了一個加密的base64編碼。

什麼是Base64?

按照RFC2045的定義,Base64被定義為:Base64內容傳送編碼被設計用來把任意序列的8位位元組描述為一種不易被人直接識別的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)

為什麼要使用Base64?

在設計這個編碼的時候,我想設計人員最主要考慮了3個問題:
1.是否加密?
2.加密演算法複雜程度和效率
3.如何處理傳輸?

加密是肯定的,但是加密的目的不是讓使用者傳送非常安全的Email。這種加密方式主要就是“防君子不防小人”。即達到一眼望去完全看不出內容即可。
基於這個目的加密演算法的複雜程度和效率也就不能太大和太低。和上一個理由類似,MIME協議等用於傳送Email的協議解決的是如何收發Email,而並不是如何安全的收發Email。因此演算法的複雜程度要小,效率要高,否則因為傳送Email而大量佔用資源,路就有點走歪了。

但是,如果是基於以上兩點,那麼我們使用最簡單的愷撒法即可,為什麼Base64看起來要比愷撒法複雜呢?這是因為在Email的傳送過程中,由於歷史原因,Email只被允許傳送ASCII字元,即一個8位位元組的低7位。因此,如果您傳送了一封帶有非ASCII字元(即位元組的最高位是1)的Email通過有“歷史問題”的閘道器時就可能會出現問題。閘道器可能會把最高位置為0!很明顯,問題就這樣產生了!因此,為了能夠正常的傳送Email,這個問題就必須考慮!所以,單單靠改變字母的位置的愷撒之類的方案也就不行了。關於這一點可以參考RFC2046。
基於以上的一些主要原因產生了Base64編碼。

鑑於演算法比較讓人頭大,想看的人自然會有看到的辦法拉,俺是頭大得很,就不放上來了。


vbscript中gb2312轉換為UTF-8編碼的函式2007-1-25 0:29:04 www.aspxuexi.com
本文主題:vbscript中gb2312轉換為UTF-8編碼的函式