载入中,请稍候……

编码字符之间的转换(C/C++)

Admin 于 2008-09-21 04:22:10 发表C/C++

订阅: http://www.miniboke.com/Feed/Article_38.aspx
引用: http://www.miniboke.com/Trackback/WJIQtvfNGhYyXdwoLFDE.aspx (UTF-8)
数学符号 < 编码字符之间的转换(C/C++) > Google Reader 快捷键

最近一段做一些关于文字编码方面的东西,常常涉及到各种编码字符之间的转换。主要是做中日文方面的,包括中文gb2312, 日文JIS, SHIFT-JIS,以及他们和Unnicode码之间的转换。

GBK <==> Unicode

  1. unsigned short GBK2UNI(unsigned short usGBK) 
  2.     unsigned char  szEUC[2] = { usGBK >> 8, usGBK & 0xFF }; 
  3.     unsigned short usUNI; 
  4.     MultiByteToWideChar(        
  5.         936, 
  6.         0, 
  7.         (LPCSTR)szEUC,  
  8.         2, 
  9.         &usUNI,     
  10.         1 
  11.     ); 
  12.     return usUNI;   
  13.  
  14. unsigned short UNI2GBK(unsigned short usUNI) 
  15.     unsigned char  szGBK[3]={0}; 
  16.     unsigned short wzUNI[2] = { usUNI, 0 }; 
  17.     unsigned short usGBK; 
  18.     WideCharToMultiByte( 
  19.         936, 
  20.         0, 
  21.         wzUNI,  
  22.         2, 
  23.         (LPSTR)szGBK,     
  24.         2, 
  25.         0, 
  26.         0 
  27.     ); 
  28.     usGBK = (szGBK[0] << 8) | szGBK[1];    
  29.     return usGBK; 

SHIFT-JIS <==> Unicode

  1. unsigned short SJIS2UNI(unsigned short usSJIS) 
  2.     unsigned char  szEUC[2] = { usSJIS >> 8, usSJIS & 0xFF }; 
  3.     unsigned short usUNI; 
  4.     MultiByteToWideChar(        
  5.         932, 
  6.         0, 
  7.         (LPCSTR)szEUC,  
  8.         2, 
  9.         &usUNI,     
  10.         1 
  11.     ); 
  12.     return usUNI;   
  13.  
  14. unsigned short UNI2SJIS(unsigned short usUNI) 
  15.     unsigned char  szSJIS[3]  = { 0 }; 
  16.     unsigned short wzUNI[2] = { usUNI, 0 }; 
  17.     unsigned short usSJIS; 
  18.     WideCharToMultiByte( 
  19.         932, 
  20.         0, 
  21.         wzUNI,  
  22.         2, 
  23.         (LPSTR)szSJIS,     
  24.         2, 
  25.         0, 
  26.         0 
  27.     ); 
  28.     usSJIS = (szSJIS[0] << 8) | szSJIS[1];    
  29.     return usSJIS; 

三  JIS <=> Unicode

  1. unsigned short JIS2UNI(unsigned short usJIS) 
  2.     unsigned char  szEUC[2] = { (usJIS | 0x8080) >> 8, (usJIS | 0x8080) & 0xFF }; 
  3.     unsigned short usUNI; 
  4.     MultiByteToWideChar(        
  5.         20932, 
  6.         0, 
  7.         (LPCSTR)szEUC,  
  8.         2, 
  9.         &usUNI,     
  10.         1 
  11.     ); 
  12.     return usUNI;   
  13. unsigned short UNI2JIS(unsigned short usUNI) 
  14.     unsigned char  szJIS[3]  = { 0 }; 
  15.     unsigned short wzUNI[2] = { usUNI, 0 }; 
  16.     unsigned short usJIS; 
  17.     WideCharToMultiByte( 
  18.         20932, 
  19.         0, 
  20.         wzUNI,  
  21.         2, 
  22.         (LPSTR)szJIS,     
  23.         2, 
  24.         0, 
  25.         0 
  26.     ); 
  27.     usJIS = (szJIS[0] << 8) | szJIS[1];    
  28.     return usJIS; 

四  JIS <=> SHIFT-JIS

  1. unsigned short SJIS2JIS( unsigned short sjis ) 
  2.     unsigned short ubyte, lbyte; 
  3.     
  4.     
  5.     if (((sjis >= 0x8140) && (sjis <= 0x9ffc)) || 
  6.         ((sjis >= 0xe040) && (sjis <= 0xeffc)) ) 
  7.     { 
  8.         ubyte = sjis >> 8; 
  9.         lbyte = sjis & 0x00ff; 
  10.         
  11.         if ( (lbyte <= 0x3f) || (lbyte == 0x7f) || 
  12.                 (lbyte >= 0xfd) ) return 0; 
  13.         
  14.         if ( ubyte >= 0xe0 ) ubyte -= 0xc0; else ubyte -= 0x80; 
  15.         ubyte = (ubyte << 1) + 0x1f; 
  16.         
  17.         if ( lbyte >= 0x9f ) 
  18.         { 
  19.             ubyte++; 
  20.             lbyte -= 0x7e; 
  21.         } else { 
  22.             if ( lbyte >= 0x80 ) lbyte--; 
  23.             lbyte -= 0x1f; 
  24.         } 
  25.         
  26.         return ( ubyte << 8 ) + lbyte; 
  27.         
  28.     } else { 
  29.         return 0; 
  30.     } 
  31.  
  32. unsigned short JIS2SJIS( unsigned short jis ) 
  33.     unsigned short     ubyte, lbyte; 
  34.     
  35.     
  36.     ubyte = jis >> 8; 
  37.     lbyte = jis & 0x00ff; 
  38.     
  39.     lbyte += 0x1f; 
  40.     if ( lbyte >= 0x7f ) lbyte++; 
  41.     if ( lbyte <= 0x3f ) return 0; 
  42.     
  43.     if ( (ubyte & 0x0001) == 0 ) 
  44.     { 
  45.         lbyte = jis & 0x00ff; 
  46.         lbyte += 0x7e; 
  47.         ubyte--; 
  48.         if ( lbyte > 0xfd ) return 0; 
  49.     } 
  50.     
  51.     ubyte -= 0x1f; 
  52.     ubyte = ubyte >> 1; 
  53.     ubyte += 0x80; 
  54.     if ( ubyte >= 0xa0 ) ubyte += 0x40; 
  55.     
  56.     if ( ((ubyte >= 0x81) && (ubyte <= 0x9f)) || 
  57.             ((ubyte >= 0xe0) && (ubyte <= 0xef)) ) 
  58.     { 
  59.         return (ubyte << 8) + lbyte; 
  60.     } else { 
  61.         return 0; 
  62.     } 

UNI2JIS这个函数好像不太好用,其他的都经过测试,没有问题的。现在还不知道具体原因,现在从Unicode转到JIS是分两个步骤的,第一个步骤是先将Unicode转到SHIFT-JIS,然后由SHIFT-JIS转到JIS。

被阅841次, 0投一票编码 VC++
  • 看完了要说点啥么?
  • 昵称 (不填说不了话)
  • 信箱地址 (不会被公开,但是不填也说不了话)
  • 网址 (这个不填也成)

Powered by MiniBoke v2.0.0.8 Build 0828

Copyright © 2008 迷你博客. All rights reserved.

粤ICP备07500939号