找回密码
 注册
搜索
查看: 6003|回复: 0

字符集之间转换(UTF-8,UNICODE,Gb2312)

[复制链接]
发表于 2006-12-20 15:32:46 | 显示全部楼层 |阅读模式
特搜集了UTF-8,UNICODE,Gb2312他们3个之间的相互转换.
: N8 o5 r6 F* c
8 X6 v8 e0 Q* N2 k8 VUTF-8:   3字节一个字符
. n7 K1 X: N7 J/ k$ J$ @- ~UNICODE: 2字节一个字符+ d0 ?7 q" q  f+ [' I) K
GB2312:  1字节一个字符
. K7 d6 {2 a* Z9 ~2 c& }
6 u- }* j; R* G3 Y例子:+ D9 Q0 @; G! \5 x% M

/ P: W* j8 A  H5 g. k. K7 r6 |4 u“你”字的UTF-8编码: E4 BD A0        11100100 10111101 10100000
% H( G6 z+ O0 ?# C6 R“你”的Unicode编码: 4F 60          01001111 011000008 W" u- Z8 o, Y
按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000
; C5 z5 d: i* I; V8 }1 V把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。5 f% N! s! s# Y7 j1 H0 _! X& o. B# M
注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。
2 A4 m& z' I8 @6 T  Q: T, B4 p3 u) Z经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。5 T# A& |9 w9 W1 M
# E% |. Q6 B5 W2 ~% S) P7 l, ~$ [; e
类定义5 s) g* s9 D" ~* J; ]! p6 V0 Y
  1. class CChineseCode- \  A$ v4 d) \3 T* R0 n
  2. {( n. u6 z, K9 L4 D- z3 P, ^8 w0 b
  3.    public:4 F+ t& ]0 G! Z* G8 q
  4.        static void UTF_8ToUnicode(wchar_t* pOut,char *pText);  // 把UTF-8转换成Unicode9 n9 \# C( l% `2 d
  5.        static void UnicodeToUTF_8(char* pOut,wchar_t* pText);  //Unicode 转换成UTF-8
    - o7 O$ N( e( I
  6.        static void UnicodeToGB2312(char* pOut,wchar_t uData);  // 把Unicode 转换成 GB2312 7 L. j- J+ n% ?* n2 m6 w, d
  7.        static void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer);// GB2312 转换成 Unicode
    " H) b! k% n; K4 ^
  8.        static void GB2312ToUTF_8(string& pOut,char *pText, int pLen);//GB2312 转为 UTF-8
    - x  @5 z3 _* r. O1 s
  9.        static void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//UTF-8 转为 GB2312; [" f# J- C/ d4 `2 q9 `$ H5 r
  10. };
复制代码
类实现% f7 @, K0 h7 m2 d0 ?  {5 S/ j/ f
1 c( B4 c1 O0 W$ p! ~
  1. void CChineseCode::UTF_8ToUnicode(wchar_t* pOut,char *pText)
    / X3 v! M/ S8 u0 a# |2 u
  2. {
    % H+ |6 y$ X) |: y, |, X; p5 f
  3.     char* uchar = (char *)pOut;
    # T6 I5 t" ]4 c& g0 M

  4. " F/ `! N4 u* v7 x: ~
  5.     uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);# P1 @$ p8 q- z" x0 x- U$ B
  6.     uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);1 [# x7 S) H) F7 x

  7. : V  [. c! v0 e( ^/ }( p
  8.     return;6 r$ a; p+ v$ V3 ~9 k+ P
  9. }
    ) M. C- S& M  I; l  V( V
  10. 2 c  m; a) `) x, a6 b* u8 t7 f4 i
  11. void CChineseCode::UnicodeToUTF_8(char* pOut,wchar_t* pText): M7 x4 S0 E8 Y0 @2 Z2 V2 E$ j
  12. {/ O; ]; i+ T7 g# Z: u9 a4 U
  13.     // 注意 WCHAR高低字的顺序,低字节在前,高字节在后. t' w( x8 g" V# h5 Q
  14.     char* pchar = (char *)pText;$ t9 {- M9 u, P, C% g/ E
  15. # g+ k; Z- X& _$ W. N
  16.     pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));( |$ {% p9 B  G8 `$ V# D& @
  17.     pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
    4 l  P* G* K# m( {' E
  18.     pOut[2] = (0x80 | (pchar[0] & 0x3F));1 w6 w: a8 N0 \; h- n
  19. ' ]* M6 j0 X0 M
  20.     return;6 z5 R5 U4 O* X) W' W
  21. }1 m7 j# P2 E4 C4 |! I
  22. , |# b3 d% S6 }5 @6 k" [/ t1 e
  23. void CChineseCode::UnicodeToGB2312(char* pOut,wchar_t uData)
    ( w2 v1 m8 T5 a1 E& i/ }
  24. {
    8 O# x- ?7 v+ v7 o) |# x
  25.     WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL);
    & b4 a/ X- p# a6 }/ k! f" D) x
  26.     return;
    , f0 B; G, H. c- h  Y7 E: v( u
  27. }     0 o. E( g, q& A! _( Y

  28. 8 a3 D% j! B! ~# P! ]/ f
  29. void CChineseCode::Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer)
    ( ^$ z, X' U4 d; L
  30. {
    5 C1 }' k5 P/ j$ Q2 K- i: H
  31.     ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
    9 C" T! N" p- r. u/ M  }
  32.     return ;
    , P& m0 B: i" S" e9 j
  33. }
    . e# M3 {# Y7 f: `4 Y" a) a

  34. * c; ~' \& R! `& ~6 r
  35. void CChineseCode::GB2312ToUTF_8(string& pOut,char *pText, int pLen)
    ! ~1 C/ W; D4 \8 D
  36. {- H* Z* G+ I- W2 v# F
  37.     char buf[4];
    ) O( m  }+ v; {+ H0 }
  38.     int nLength = pLen* 3;' \1 _. K. F. B6 Y* [: t) Q7 ?8 q
  39.     char* rst = new char[nLength];# W) d3 W  e' m; O  A
  40.     7 e1 Y# d2 N* t( z. P
  41.     memset(buf,0,4);
    1 S; M8 `  C' P1 r$ [7 F: _
  42.     memset(rst,0,nLength);- j; Q6 F( x' U! n* V) ~
  43.     1 z( R2 n5 F9 B' C8 }6 z' @& |
  44.     int i = 0;" A, m+ \) O' H3 k* _
  45.     int j = 0;      
    ( t% t  s2 v, _0 b0 P. B
  46.     while(i < pLen)
    4 v2 M8 l' ?5 a
  47.     {# Z, t- S/ z& x8 f2 ~$ w8 a  I
  48.             //如果是英文直接复制就可以! L' T4 ^& H) J( O: E, c. E
  49.             if( *(pText + i) >= 0)
    * m$ u5 U$ z: j" _' \% Z  s, p
  50.             {
    / j/ ]& Q" I$ V* _/ J( n
  51.                     rst[j++] = pText[i++];( `0 n; z) a; h6 c
  52.             }. `- T! j/ v! ]; n
  53.             else0 @- ?# ^; H$ Q3 R( }% G; _( k
  54.             {
    . C6 |4 L6 F0 I5 D
  55.                     wchar_t pbuffer;
      B5 p( ~. c$ f  a( Z9 g
  56.                     Gb2312ToUnicode(&pbuffer,pText+i);
      ^- M5 c' x* N: R2 Q
  57.                     1 K* v: ?6 v) m, E+ D0 D, t
  58.                     UnicodeToUTF_8(buf,&pbuffer);
    7 \  [9 _3 l1 d3 D9 H& W3 g7 M4 h
  59.                     
    7 e9 o8 Z. S$ ~) F% ]
  60.                     unsigned short int tmp = 0;
    # e0 E- C) \9 Z: o
  61.                     tmp = rst[j] = buf[0];+ o8 U8 g8 N# i6 B7 W5 U
  62.                     tmp = rst[j+1] = buf[1];
    1 h* V0 h( a  ~
  63.                     tmp = rst[j+2] = buf[2];   
    / m* f9 r0 E, B1 T9 j) y- ]
  64.                     & P# v7 @( {) ~8 t( p: K) y
  65.                     j += 3;
    - X6 P+ N; Z+ D- T3 ~
  66.                     i += 2;( W% Y3 \) Z" U/ [$ G+ a
  67.             }( Z$ \% u8 R2 Q. M3 @
  68.     }( M: |: e' b9 ?$ z% k
  69.     rst[j] = '\0';2 Z0 x# `' H; m
  70. 6 |5 f0 r" v/ H+ H, W
  71.     //返回结果# ~) ?5 P" D: a- u' A' N' i) P
  72.     pOut = rst;            
    ; g* C6 s8 n0 |0 s9 a  {1 k
  73.     delete []rst;   7 ~3 h( S* y- S1 a! F
  74.     ! V. m6 h4 R/ E! J
  75.     return;
    6 p$ t. o* @9 V% d. T' f) p
  76. }
    ; G1 `+ h- L0 d, h7 K, w9 i
  77. % m4 @/ d& y7 ]$ [0 b
  78. void CChineseCode::UTF_8ToGB2312(string &pOut, char *pText, int pLen)5 L. g" h6 p7 N7 e% T$ W. t
  79. {
    0 N9 a' N5 P3 f0 |% S  T
  80.     char * newBuf = new char[pLen];3 ~" N4 e2 @" T0 a  ?/ F
  81.     char Ctemp[4];
    ) V3 h; r* O, p2 F) w, V
  82.     memset(Ctemp,0,4);
    / y) ~2 V# o, R# [- s. W

  83. , m1 R+ K% c% r" K1 ]  [: O
  84.     int i =0;
    0 N6 [2 u. n. j3 B6 y; v
  85.     int j = 0;
    : N) \. }. h1 V% C, s
  86.    
    / e% G7 {% r! X8 [
  87.     while(i < pLen)
    , O  H$ u8 e7 v# Y* A/ n: q
  88.     {
    & L- N8 i& w9 d/ u, W5 N* e
  89.         if(pText[i] > 0)
    # m  |7 v) L1 t8 m) _3 z6 \# m7 v
  90.         {
    # O' J; }* _7 Y! t
  91.                 newBuf[j++] = pText[i++];                       
    : j" ~$ z8 s* d7 Z% A3 g6 U( \1 Z" W
  92.         }
    6 b/ D" Y) v7 i. P) _3 E
  93.         else                 
    " ^. j" q9 P, P* l9 B% q
  94.         {& q/ k: w2 S% S2 N, `4 T! q& o& R
  95.                 WCHAR Wtemp;( A% F4 ?7 @$ k* Z
  96.                 UTF_8ToUnicode(&Wtemp,pText + i);) z2 i" ]6 Y. j+ l- X. Q3 L
  97.         
    9 X) t9 U! P) v' ?# q4 h
  98.                 UnicodeToGB2312(Ctemp,Wtemp);' E2 n- ^+ c- j; X0 Y- l5 _
  99.             
    & d0 `' d" l) s; N2 M
  100.                 newBuf[j] = Ctemp[0];
    / O1 ?7 M$ g" o/ Z2 F
  101.                 newBuf[j + 1] = Ctemp[1];0 {" B) X, a3 e2 s; F4 R. S, o" o* y
  102. 8 n. B& q0 y* J
  103.                 i += 3;    5 f  b; H% ^5 y. b' U0 v, y
  104.                 j += 2;   
    6 Y2 {' B2 S1 G
  105.         }
    - z; r' M4 e4 [# ?
  106.     }8 k& G! i; o  a5 q
  107.     newBuf[j] = '\0';% N1 ]7 v. ]" P) I' h  ]/ F
  108.     - s7 m9 ^9 H2 z9 ]7 L8 D9 }; P
  109.     pOut = newBuf;- s! K6 y/ q, G' d
  110.     delete []newBuf;  T! r5 b: {: t
  111.    
    9 d* k4 a2 b9 v
  112.     return; 1 o( I" c; o3 o6 t9 X
  113. }  
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-8-13 20:16 , Processed in 0.023874 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表