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

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

[复制链接]
发表于 2006-12-20 15:32:46 | 显示全部楼层 |阅读模式
特搜集了UTF-8,UNICODE,Gb2312他们3个之间的相互转换.
7 E) F  `; p' }; S! D* Y' c/ @# f9 y8 ^
( K, _  b6 @6 c& N/ AUTF-8:   3字节一个字符
' v0 L; j7 Q' ?7 ZUNICODE: 2字节一个字符
; @0 J# s9 M" E8 X, tGB2312:  1字节一个字符8 B1 G4 U+ a9 s$ j

5 L  `& O/ n& n$ u5 n* L- q$ b例子:
% F1 j) u9 ~  T4 R# n9 B; d( e; Y- `1 ?$ N8 d) q% _5 p4 ]
“你”字的UTF-8编码: E4 BD A0        11100100 10111101 10100000
9 f$ E9 I( v2 m9 _) W1 [; F) Y. m+ q: [“你”的Unicode编码: 4F 60          01001111 01100000
4 C/ b+ |+ ~# g) g) Y9 O按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000
8 J0 Y% d& J, U7 K把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。
7 k# r8 N) y4 O' W$ P0 R8 h. _注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。8 b( i3 [% i/ n. O
经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。
7 h7 }( k, v7 J, e5 A# H/ V8 _7 y
5 Q, P$ x- b% ]  I; O/ I5 X- n类定义( N4 m0 p& Z' s
  1. class CChineseCode
    6 v4 P1 ?# o( F, d1 A* v8 D7 f
  2. {
    ( [) I% C9 @. n
  3.    public:2 p. z8 S& U* z; p+ Z$ W# ^
  4.        static void UTF_8ToUnicode(wchar_t* pOut,char *pText);  // 把UTF-8转换成Unicode* {2 o% o' F$ P' a
  5.        static void UnicodeToUTF_8(char* pOut,wchar_t* pText);  //Unicode 转换成UTF-83 ]4 N: l& t0 V  I& g/ k* U
  6.        static void UnicodeToGB2312(char* pOut,wchar_t uData);  // 把Unicode 转换成 GB2312
    7 M; j8 _2 t0 {: A# E* s
  7.        static void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer);// GB2312 转换成 Unicode9 S- q& O; M* O1 I1 c3 A# [
  8.        static void GB2312ToUTF_8(string& pOut,char *pText, int pLen);//GB2312 转为 UTF-8
    * R' v3 n- u7 y) A3 U3 D0 r
  9.        static void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//UTF-8 转为 GB2312
    / Q; \* L  K/ H$ e2 Y" {4 S
  10. };
复制代码
类实现, b0 j5 R/ |  g( c, l& ?! \6 a) [, {

6 Y: P0 L# [, `9 G3 @
  1. void CChineseCode::UTF_8ToUnicode(wchar_t* pOut,char *pText), }% F( R, l$ c
  2. {4 @3 x% u0 R5 {2 G9 k
  3.     char* uchar = (char *)pOut;
    $ {4 H. y& D& N9 b3 S1 o3 t

  4. % V1 \6 S; g# Y9 W3 b+ A0 J6 f
  5.     uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);
    % F7 |/ _! M' h' M# j; s
  6.     uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);
    + R3 p) X# h6 P3 d
  7. 5 K* a2 d( Z5 R3 A" C9 w- e
  8.     return;
    + [% |% C) C7 H! G5 c3 Z
  9. }( `* }' I! ~& Z9 v& u: C) l& o
  10. % k  _( @: o+ d& j
  11. void CChineseCode::UnicodeToUTF_8(char* pOut,wchar_t* pText)0 k$ e( f' {1 u: C# `- ^  ]4 \
  12. {( P  z$ ?4 i9 E2 o
  13.     // 注意 WCHAR高低字的顺序,低字节在前,高字节在后
    # A  q9 A: @, }" k' I' R0 w
  14.     char* pchar = (char *)pText;
    + L1 g. w; M7 n, |! {% T! ]4 c

  15.   Y* D6 r4 i" m, ?# j2 `6 u
  16.     pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
    / w3 V3 l+ `7 j. Z& f6 l, o
  17.     pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);3 x" ~4 A+ B8 c9 i6 ?- a6 g& b
  18.     pOut[2] = (0x80 | (pchar[0] & 0x3F));$ l6 `; ^: J* C- E4 P
  19. % }# z6 C0 I/ f6 I
  20.     return;
    / Y- Q/ `$ E3 w4 m% Q
  21. }
    " ^, x  e  V" j& v6 u

  22. 9 T0 h4 p. q, J0 s+ B* z- {8 }
  23. void CChineseCode::UnicodeToGB2312(char* pOut,wchar_t uData)4 H! r7 ^* R( I+ J  _7 ?
  24. {8 j; C: d. |4 O. r: O- T
  25.     WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL);& H! y. R( o1 g) N/ E4 w
  26.     return;
    5 X! a* W3 G* W! j
  27. }     4 h; V* U0 C- g* B6 d8 ?- q5 N

  28. & {+ u3 X: H6 V( Z+ g. v' `" `
  29. void CChineseCode::Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer)9 M% _8 t6 ~; y1 `  M7 i' R2 A9 N
  30. {
    1 h* J% r6 C; {0 \
  31.     ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
    ' z  Q- E* m; Q) `9 q. E
  32.     return ;
    - Z, q" ~4 C7 Z/ x! G4 X3 k  Z8 N9 g
  33. }0 s) x* Q# b1 H$ f/ k0 g( u. D
  34. + K6 x5 f0 X9 v9 [% f2 K- f3 F3 R5 Z
  35. void CChineseCode::GB2312ToUTF_8(string& pOut,char *pText, int pLen)" ?& e* O! h8 `) x% g
  36. {
    ) ?3 [6 U# N7 {- T
  37.     char buf[4];# m3 _  `' I9 {9 {0 x6 `( [: G
  38.     int nLength = pLen* 3;0 R& _# J4 Y8 n- u  V
  39.     char* rst = new char[nLength];
    6 Z: i& V  ?' t: \4 y
  40.     0 R. E1 w/ i. k( A
  41.     memset(buf,0,4);. S6 ]+ E$ Q: ^2 J
  42.     memset(rst,0,nLength);+ G% r$ ?1 f5 p& m
  43.    
    8 l9 r$ i+ H5 f/ J
  44.     int i = 0;; E$ z& ~% t' z+ f, a2 d0 `
  45.     int j = 0;      
    3 y6 H, a& W' k4 Q4 X: a
  46.     while(i < pLen)- C" y+ X& @5 G1 w! \4 u
  47.     {8 ?# l. f$ |" K3 A3 e# T! d
  48.             //如果是英文直接复制就可以1 Y. p; M4 `# Z. w, c
  49.             if( *(pText + i) >= 0)
    / m% ]* Z4 n  v* v: D4 Q: v
  50.             {
    8 G/ d  T6 D; c- |. H7 ~
  51.                     rst[j++] = pText[i++];
    + x: W- {7 n! b: B  q  Z  X! O2 ~8 @- ?
  52.             }' L- z3 o/ [# J2 q) Y# A% v
  53.             else
    " ~, Q. [% N2 P: t
  54.             {
    3 m4 I1 B% [; A' g( ]& d' j$ Q
  55.                     wchar_t pbuffer;3 G: v# O* d1 i  {
  56.                     Gb2312ToUnicode(&pbuffer,pText+i);/ t5 w2 q) o2 ]& m  [
  57.                     ! F" B9 l) w5 |  V% F
  58.                     UnicodeToUTF_8(buf,&pbuffer);
    & x2 {6 w# R0 G  h
  59.                     
    ' T) R* Z. A' S& Z
  60.                     unsigned short int tmp = 0;1 Y& K% j& \0 W  _) Z3 E- b
  61.                     tmp = rst[j] = buf[0];% H" \! T/ e' {$ k# z4 }6 O9 q
  62.                     tmp = rst[j+1] = buf[1];$ Y3 r$ X+ p( D3 }
  63.                     tmp = rst[j+2] = buf[2];   
    1 x. t8 w6 U1 z7 E
  64.                     / _: W) n3 Y# X+ H7 A$ D6 O- p
  65.                     j += 3;
    : S/ }' Q2 o! ~6 c; D$ K) P5 x
  66.                     i += 2;% x* i" S! b5 R9 E8 }. P8 G. @" y  z
  67.             }8 }5 \( O( g) l8 E) X0 t& g
  68.     }
    ; l7 y3 c! {# g
  69.     rst[j] = '\0';6 a' F  T. ?  {% n+ W$ o' Z

  70. : \: Z- q/ M3 k5 [0 O! |
  71.     //返回结果
      O# I8 j3 \+ B9 D
  72.     pOut = rst;             2 \, `* y" @' H0 Z
  73.     delete []rst;   1 L. x3 {; y( {; g* F- q) o" w
  74.     2 E3 P0 S! h$ W7 |1 S5 M  I/ c5 D
  75.     return;; O" ^$ \. M& s7 n" T+ j5 B, O/ w
  76. }
    0 h$ ]4 b: a$ b! K2 N. l

  77.   }' @  Y& D% y- S
  78. void CChineseCode::UTF_8ToGB2312(string &pOut, char *pText, int pLen)1 L" Y' C: ?# X0 K" B& U3 [  }
  79. {9 v1 s( I  |* o4 Z# m0 H% m
  80.     char * newBuf = new char[pLen];
    % V  U- C# ~% [( |7 N) [
  81.     char Ctemp[4];
    8 k* S7 ^0 A8 [5 r' x6 \: ?$ ]
  82.     memset(Ctemp,0,4);8 v6 c! ^! n3 I! G; O$ K' g
  83. 8 L( y2 U( ^1 B% d# M9 m
  84.     int i =0;9 @! o. [5 W1 Q: r" \) M7 H' I
  85.     int j = 0;
    ' a3 Y2 J' M# d$ s
  86.    
    ; f; H( F1 ~9 V2 l0 y- M) o
  87.     while(i < pLen)1 e, m- i" t! e" X3 v. ~$ s; W
  88.     {
    7 ~+ y% f7 g  k# {
  89.         if(pText[i] > 0)3 m9 r6 @# R& x! m0 l
  90.         {
    ' L5 [9 y. ^( B& O  L" ~0 f' E; L
  91.                 newBuf[j++] = pText[i++];                       
    * Q% M5 u% x- m1 I: F) L
  92.         }
    / P4 }# `7 v+ r9 n$ l3 }4 ~/ T
  93.         else                 / N" h: e0 `- q" i
  94.         {- s7 n" p$ w& Q& }( r3 t
  95.                 WCHAR Wtemp;  ]( o6 B9 k9 f1 Q" {+ [
  96.                 UTF_8ToUnicode(&Wtemp,pText + i);
    3 p: y- U4 \" ]5 J( W/ v
  97.         
    + }! V. u) S: x# m
  98.                 UnicodeToGB2312(Ctemp,Wtemp);, \/ b0 q. Y4 M: j& R( h* m2 t2 n
  99.             
    5 Q( B5 i9 F) B- u+ V! A# o+ ~+ \
  100.                 newBuf[j] = Ctemp[0];/ M+ X5 L7 \( \% l$ }6 H) q" `
  101.                 newBuf[j + 1] = Ctemp[1];
    ' x/ e- G6 A  B; A

  102. 5 r3 I# @7 S/ H: p9 b
  103.                 i += 3;   
    6 |$ D8 l9 s9 j4 q2 \
  104.                 j += 2;   
    $ K! ]3 w" {  a4 V$ A
  105.         }
    0 Z4 n  S6 A" I( H
  106.     }/ Y# d8 [7 R! K& p' P: Z
  107.     newBuf[j] = '\0';* B: f( P9 B* J1 j+ N! N0 w, V" m
  108.     0 P' ?" q+ ]- u; l. m* R) K
  109.     pOut = newBuf;
    $ T, R! K5 h( T' z/ z+ J1 l( Y
  110.     delete []newBuf;
    , t. p& q/ k" @; e* c( S0 m
  111.    
    * \* C1 {% |6 B+ K
  112.     return;
    4 ~- W+ l. q8 J, I/ z
  113. }  
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 16:30 , Processed in 0.016898 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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