UTF-8、UTF-16、UTF-32之间的编码转换

开发语言:C++

功能描述:

Unicode内码转换器。用于UTF-8、UTF-16(UCS2)、UTF-32(UCS4)之间的编码转换。

下载地址:

UnicodeConverter.zip

版本历史:

V1.0 2010年03月12日

  • 完成正式版本。

源代码:

UnicodeConverter.h

[cpp] view plain copy print ?
  1. /* ----------------------------------------------------------
  2. 文件名称:UnicodeConverter.h
  3. 作者:秦建辉
  4. MSN:[email protected]
  5. 当前版本:V1.0
  6. 历史版本:
  7.     V1.0    2010年03月12日
  8.             完成正式版本。
  9. 功能描述:
  10.     Unicode内码转换器。用于utf-8、utf-16(UCS2)、utf-32(UCS4)之间的编码转换
  11. ------------------------------------------------------------ */ 
  12. #pragma once 
  13.  
  14. #include <windows.h> 
  15. #include <stdio.h> 
  16. #include <ostream> 
  17.  
  18. using namespace std; 
  19.  
  20. class CUnicodeConverter 
  21. /* -------------------------------------------------------------
  22.                     内码转换
  23.    ------------------------------------------------------------- */ 
  24. public
  25.     /*
  26.     功能:将UCS4编码转换成UTF8编码
  27.     参数:
  28.         dwUCS4:要转换的UCS4编码
  29.         pbUTF8:用于存储转换后的UTF8编码。设为NULL,可以获取长度信息(字节数)
  30.     返回值:
  31.           0:无效的UCS4编码
  32.         1-6:UTF8编码的有效长度
  33.     */ 
  34.     static INT UCS4_To_UTF8( DWORD dwUCS4, BYTE* pbUTF8 ); 
  35.  
  36.     /*
  37.     功能:将UTF8编码转换成UCS4编码
  38.     参数:
  39.         pbUTF8:要转换的UTF8编码
  40.         dwUCS4:存储转换后的UCS4编码
  41.     返回值:
  42.           0:参数错误或无效的UTF8编码
  43.         1-6:UTF8编码的有效长度
  44.     */ 
  45.     static INT UTF8_To_UCS4( const BYTE* pbUTF8, DWORD& dwUCS4 ); 
  46.  
  47.     /*
  48.     功能:将UCS4编码转换成UTF16编码
  49.     参数:
  50.         dwUCS4:要转换的UCS4编码
  51.         pwUTF16:用于存储转换后的UTF16编码。设为NULL,可以获取长度信息(字符数)
  52.     返回值:
  53.         0:无效的UCS4编码
  54.         1:转换成1个UTF16编码
  55.         2:转换成2个UTF16编码
  56.     */ 
  57.     static INT UCS4_To_UTF16( DWORD dwUCS4, WORD* pwUTF16 ); 
  58.  
  59.     /*
  60.     功能:将UTF16编码转换成UCS4编码
  61.     参数:
  62.         pwUTF16:需要转换的UTF16编码
  63.         dwUCS4:存储转换后的UCS4编码
  64.     返回值:
  65.         0:参数错误或无效的UTF16编码
  66.         1:1个UTF16编码被转换
  67.         2:2个UTF16编码被转换
  68.     */ 
  69.     static INT UTF16_To_UCS4( const WORD* pwUTF16, DWORD& dwUCS4 ); 
  70.  
  71.     /*
  72.     功能:将UTF8字符串转换成UTF16字符串
  73.     参数:
  74.         pbszUTF8Str:需要转换的UTF8字符串
  75.         pwszUTF16Str:存储转换后的UTF16字符串。设为NULL,可以获取所需长度信息(字符数)
  76.     返回值:
  77.          0:转换失败
  78.         >0:UTF16字符串长度
  79.     */ 
  80.     static INT UTF8Str_To_UTF16Str( const BYTE* pbszUTF8Str, WORD* pwszUTF16Str ); 
  81.  
  82.     /*
  83.     功能:将UTF16字符串转换成UTF8字符串
  84.     参数:
  85.         pwszUTF16Str:需要转换的UTF16字符串
  86.         pbszUTF8Str:存储转换后的UTF8字符串。设为NULL,可以获取所需长度信息(字节数)
  87.     返回值:
  88.          0:转换失败
  89.         >0:UTF8字符串长度(不包括NULL字符)
  90.     */ 
  91.     static INT UTF16Str_To_UTF8Str( const WORD* pwszUTF16Str, BYTE* pbszUTF8Str ); 
  92.  
  93. /* -------------------------------------------------------------
  94.                     C文件写入操作
  95.    ------------------------------------------------------------- */ 
  96. public
  97.     /*
  98.     功能:向文件中写入UTF8编码
  99.     返回值:
  100.         写入的字节数
  101.     */ 
  102.     static UINT Print_UTF8_By_UCS4( FILE* out, DWORD dwUCS4 ); 
  103.  
  104.     /*
  105.     功能:向文件中写入UTF16编码
  106.     返回值:
  107.         写入的字节数
  108.     */ 
  109.     static UINT Print_UTF16_By_UCS4( FILE* out, DWORD dwUCS4, BOOL isBigEndian = FALSE ); 
  110.  
  111.     /*
  112.     功能:将UTF16字符串以UTF8编码输出到文件中
  113.     返回值:
  114.         写入的字节数
  115.     */ 
  116.     static UINT Print_UTF8Str_By_UTF16Str( FILE* out, const WORD* pwszUTF16Str ); 
  117.      
  118.     /*
  119.     功能:将UTF8字符串以UTF16编码输出到文件中
  120.     返回值:
  121.         写入的字节数
  122.     */ 
  123.     static UINT Print_UTF16Str_By_UTF8Str( FILE* out, const BYTE* pbszUTF8Str, BOOL isBigEndian = FALSE ); 
  124.  
  125.     /*
  126.     功能:向文件中输出UTF8编码字节序标记
  127.     返回值:
  128.         写入的字节数
  129.     */ 
  130.     static UINT Print_UTF8_BOM( FILE* out ); 
  131.  
  132.     /*
  133.     功能:向文件中输出UTF16编码字节序标记
  134.     返回值:
  135.         写入的字节数
  136.     */ 
  137.     static UINT Print_UTF16_BOM( FILE* out, BOOL isBigEndian = FALSE ); 
  138.  
  139. /* -------------------------------------------------------------
  140.                     C++流输出操作
  141.    ------------------------------------------------------------- */ 
  142. public
  143.     /*
  144.     功能:向流中写入UTF8编码
  145.     返回值:
  146.         写入的字节数
  147.     */ 
  148.     static UINT Print_UTF8_By_UCS4( ostream& os, DWORD dwUCS4 ); 
  149.  
  150.     /*
  151.     功能:向流中写入UTF16编码
  152.     返回值:
  153.         写入的字节数
  154.     */ 
  155.     static UINT Print_UTF16_By_UCS4( ostream& os, DWORD dwUCS4, BOOL isBigEndian = FALSE ); 
  156.  
  157.     /*
  158.     功能:将UTF16字符串以UTF8编码输出到流中
  159.     返回值:
  160.         写入的字节数
  161.     */ 
  162.     static UINT Print_UTF8Str_By_UTF16Str( ostream& os, const WORD* pwszUTF16Str ); 
  163.      
  164.     /*
  165.     功能:将UTF8字符串以UTF16编码输出到流中
  166.     返回值:
  167.         写入的字节数
  168.     */ 
  169.     static UINT Print_UTF16Str_By_UTF8Str( ostream& os, const BYTE* pbszUTF8Str, BOOL isBigEndian = FALSE ); 
  170.  
  171.     /*
  172.     功能:向流中输出UTF8编码字节序标记
  173.     返回值:
  174.         写入的字节数
  175.     */ 
  176.     static UINT Print_UTF8_BOM( ostream& os ); 
  177.  
  178.     /*
  179.     功能:向流中输出UTF16编码字节序标记
  180.     返回值:
  181.         写入的字节数
  182.     */ 
  183.     static UINT Print_UTF16_BOM( ostream& os, BOOL isBigEndian = FALSE ); 
  184. }; 
  185.  
  186. /* ------------------------------
  187.                 END
  188.    ------------------------------ */ 
<textarea style="display: none;" class="cpp" cols="50" rows="15" name="code">/* ---------------------------------------------------------- 文件名称:UnicodeConverter.h 作者:秦建辉 MSN:[email protected] 当前版本:V1.0 历史版本: V1.0 2010年03月12日 完成正式版本。 功能描述: Unicode内码转换器。用于utf-8、utf-16(UCS2)、utf-32(UCS4)之间的编码转换 ------------------------------------------------------------ */ #pragma once #include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;ostream&gt; using namespace std; class CUnicodeConverter { /* ------------------------------------------------------------- 内码转换 ------------------------------------------------------------- */ public: /* 功能:将UCS4编码转换成UTF8编码 参数: dwUCS4:要转换的UCS4编码 pbUTF8:用于存储转换后的UTF8编码。设为NULL,可以获取长度信息(字节数) 返回值: 0:无效的UCS4编码 1-6:UTF8编码的有效长度 */ static INT UCS4_To_UTF8( DWORD dwUCS4, BYTE* pbUTF8 ); /* 功能:将UTF8编码转换成UCS4编码 参数: pbUTF8:要转换的UTF8编码 dwUCS4:存储转换后的UCS4编码 返回值: 0:参数错误或无效的UTF8编码 1-6:UTF8编码的有效长度 */ static INT UTF8_To_UCS4( const BYTE* pbUTF8, DWORD&amp; dwUCS4 ); /* 功能:将UCS4编码转换成UTF16编码 参数: dwUCS4:要转换的UCS4编码 pwUTF16:用于存储转换后的UTF16编码。设为NULL,可以获取长度信息(字符数) 返回值: 0:无效的UCS4编码 1:转换成1个UTF16编码 2:转换成2个UTF16编码 */ static INT UCS4_To_UTF16( DWORD dwUCS4, WORD* pwUTF16 ); /* 功能:将UTF16编码转换成UCS4编码 参数: pwUTF16:需要转换的UTF16编码 dwUCS4:存储转换后的UCS4编码 返回值: 0:参数错误或无效的UTF16编码 1:1个UTF16编码被转换 2:2个UTF16编码被转换 */ static INT UTF16_To_UCS4( const WORD* pwUTF16, DWORD&amp; dwUCS4 ); /* 功能:将UTF8字符串转换成UTF16字符串 参数: pbszUTF8Str:需要转换的UTF8字符串 pwszUTF16Str:存储转换后的UTF16字符串。设为NULL,可以获取所需长度信息(字符数) 返回值: 0:转换失败 &gt;0:UTF16字符串长度 */ static INT UTF8Str_To_UTF16Str( const BYTE* pbszUTF8Str, WORD* pwszUTF16Str ); /* 功能:将UTF16字符串转换成UTF8字符串 参数: pwszUTF16Str:需要转换的UTF16字符串 pbszUTF8Str:存储转换后的UTF8字符串。设为NULL,可以获取所需长度信息(字节数) 返回值: 0:转换失败 &gt;0:UTF8字符串长度(不包括NULL字符) */ static INT UTF16Str_To_UTF8Str( const WORD* pwszUTF16Str, BYTE* pbszUTF8Str ); /* ------------------------------------------------------------- C文件写入操作 ------------------------------------------------------------- */ public: /* 功能:向文件中写入UTF8编码 返回值: 写入的字节数 */ static UINT Print_UTF8_By_UCS4( FILE* out, DWORD dwUCS4 ); /* 功能:向文件中写入UTF16编码 返回值: 写入的字节数 */ static UINT Print_UTF16_By_UCS4( FILE* out, DWORD dwUCS4, BOOL isBigEndian = FALSE ); /* 功能:将UTF16字符串以UTF8编码输出到文件中 返回值: 写入的字节数 */ static UINT Print_UTF8Str_By_UTF16Str( FILE* out, const WORD* pwszUTF16Str ); /* 功能:将UTF8字符串以UTF16编码输出到文件中 返回值: 写入的字节数 */ static UINT Print_UTF16Str_By_UTF8Str( FILE* out, const BYTE* pbszUTF8Str, BOOL isBigEndian = FALSE ); /* 功能:向文件中输出UTF8编码字节序标记 返回值: 写入的字节数 */ static UINT Print_UTF8_BOM( FILE* out ); /* 功能:向文件中输出UTF16编码字节序标记 返回值: 写入的字节数 */ static UINT Print_UTF16_BOM( FILE* out, BOOL isBigEndian = FALSE ); /* ------------------------------------------------------------- C++流输出操作 ------------------------------------------------------------- */ public: /* 功能:向流中写入UTF8编码 返回值: 写入的字节数 */ static UINT Print_UTF8_By_UCS4( ostream&amp; os, DWORD dwUCS4 ); /* 功能:向流中写入UTF16编码 返回值: 写入的字节数 */ static UINT Print_UTF16_By_UCS4( ostream&amp; os, DWORD dwUCS4, BOOL isBigEndian = FALSE ); /* 功能:将UTF16字符串以UTF8编码输出到流中 返回值: 写入的字节数 */ static UINT Print_UTF8Str_By_UTF16Str( ostream&amp; os, const WORD* pwszUTF16Str ); /* 功能:将UTF8字符串以UTF16编码输出到流中 返回值: 写入的字节数 */ static UINT Print_UTF16Str_By_UTF8Str( ostream&amp; os, const BYTE* pbszUTF8Str, BOOL isBigEndian = FALSE ); /* 功能:向流中输出UTF8编码字节序标记 返回值: 写入的字节数 */ static UINT Print_UTF8_BOM( ostream&amp; os ); /* 功能:向流中输出UTF16编码字节序标记 返回值: 写入的字节数 */ static UINT Print_UTF16_BOM( ostream&amp; os, BOOL isBigEndian = FALSE ); }; /* ------------------------------ END ------------------------------ */ </textarea>  

UnicodeConverter.cpp

[cpp] view plain copy print ?
  1. #include "UnicodeConverter.h" 
  2.  
  3. /* -------------------------------------------------------------
  4.                     内码转换
  5.    ------------------------------------------------------------- */ 
  6.  
  7. // 转换UCS4编码到UTF8编码 
  8. INT CUnicodeConverter::UCS4_To_UTF8( DWORD dwUCS4, BYTE* pbUTF8 ) 
  9.     const BYTE  abPrefix[] = {0, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC}; 
  10.     const DWORD adwCodeUp[] = { 
  11.         0x80,           // U+00000000 ~ U+0000007F 
  12.         0x800,          // U+00000080 ~ U+000007FF 
  13.         0x10000,        // U+00000800 ~ U+0000FFFF 
  14.         0x200000,       // U+00010000 ~ U+001FFFFF 
  15.         0x4000000,      // U+00200000 ~ U+03FFFFFF 
  16.         0x80000000      // U+04000000 ~ U+7FFFFFFF 
  17.     }; 
  18.  
  19.     INT i, iLen; 
  20.  
  21.     // 根据UCS4编码范围确定对应的UTF-8编码字节数 
  22.     iLen = sizeof(adwCodeUp) / sizeof(DWORD); 
  23.     for( i = 0; i < iLen; i++ ) 
  24.     { 
  25.         if( dwUCS4 < adwCodeUp[i] ) 
  26.         { 
  27.             break
  28.         } 
  29.     } 
  30.  
  31.     if( i == iLen )return 0;    // 无效的UCS4编码 
  32.          
  33.     iLen = i + 1;   // UTF-8编码字节数 
  34.     if( pbUTF8 != NULL ) 
  35.     {   // 转换为UTF-8编码 
  36.         for( ; i > 0; i-- ) 
  37.         { 
  38.             pbUTF8[i] = static_cast<BYTE>((dwUCS4 & 0x3F) | 0x80); 
  39.             dwUCS4 >>= 6; 
  40.         } 
  41.  
  42.         pbUTF8[0] = static_cast<BYTE>(dwUCS4 | abPrefix[iLen - 1]); 
  43.     } 
  44.  
  45.     return iLen; 
  46.  
  47. // 转换UTF8编码到UCS4编码 
  48. INT CUnicodeConverter::UTF8_To_UCS4( const BYTE* pbUTF8, DWORD& dwUCS4 ) 
  49.     INT     i, iLen; 
  50.     BYTE    b; 
  51.  
  52.     if( pbUTF8 == NULL ) 
  53.     {   // 参数错误 
  54.         return 0; 
  55.     } 
  56.  
  57.     b = *pbUTF8++; 
  58.     if( b < 0x80 ) 
  59.     { 
  60.         dwUCS4 = b; 
  61.         return 1; 
  62.     } 
  63.  
  64.     if( b < 0xC0 || b > 0xFD ) 
  65.     {   // 非法UTF8 
  66.         return 0;  
  67.     } 
  68.  
  69.     if( b < 0xE0 ) 
  70.     { 
  71.         dwUCS4 = b & 0x1F; 
  72.         iLen = 2; 
  73.     } 
  74.     else if( b < 0xF0 ) 
  75.     { 
  76.         dwUCS4 = b & 0x0F; 
  77.         iLen = 3; 
  78.     } 
  79.     else if( b < 0xF8 ) 
  80.     { 
  81.         dwUCS4 = b & 7; 
  82.         iLen = 4; 
  83.     } 
  84.     else if( b < 0xFC ) 
  85.     { 
  86.         dwUCS4 = b & 3; 
  87.         iLen = 5; 
  88.     } 
  89.     else 
  90.     { 
  91.         dwUCS4 = b & 1; 
  92.         iLen = 6; 
  93.     } 
  94.  
  95.     for( i = 1; i < iLen; i++ ) 
  96.     { 
  97.         b = *pbUTF8++; 
  98.         if( b < 0x80 || b > 0xBF ) 
  99.         {   // 非法UTF8 
  100.             break
  101.         } 
  102.  
  103.         dwUCS4 = (dwUCS4 << 6) + (b & 0x3F); 
  104.     } 
  105.  
  106.     if( i < iLen ) 
  107.     {   // 非法UTF8 
  108.         return 0; 
  109.     } 
  110.     else 
  111.     { 
  112.         return iLen; 
  113.     } 
  114.  
  115. // 转换UCS4编码到UCS2编码 
  116. INT CUnicodeConverter::UCS4_To_UTF16( DWORD dwUCS4, WORD* pwUTF16 ) 
  117.     if( dwUCS4 <= 0xFFFF ) 
  118.     { 
  119.         if( pwUTF16 != NULL ) 
  120.         { 
  121.             *pwUTF16 = static_cast<WORD>(dwUCS4); 
  122.         } 
  123.  
  124.         return 1; 
  125.     } 
  126.     else if( dwUCS4 <= 0xEFFFF ) 
  127.     { 
  128.         if( pwUTF16 != NULL ) 
  129.         { 
  130.             pwUTF16[0] = static_cast<WORD>( 0xD800 + (dwUCS4 >> 10) - 0x40 );   // 高10位 
  131.             pwUTF16[1] = static_cast<WORD>( 0xDC00 + (dwUCS4 & 0x03FF) );     // 低10位 
  132.         } 
  133.  
  134.         return 2; 
  135.     } 
  136.     else 
  137.     { 
  138.         return 0; 
  139.     } 
  140.  
  141. // 转换UCS2编码到UCS4编码 
  142. INT CUnicodeConverter::UTF16_To_UCS4( const WORD* pwUTF16, DWORD& dwUCS4 ) 
  143.     WORD    w1, w2; 
  144.  
  145.     if( pwUTF16 == NULL ) 
  146.     {   // 参数错误 
  147.         return 0; 
  148.     } 
  149.  
  150.     w1 = pwUTF16[0]; 
  151.     if( w1 >= 0xD800 && w1 <= 0xDFFF ) 
  152.     {   // 编码在替代区域(Surrogate Area) 
  153.         if( w1 < 0xDC00 ) 
  154.         { 
  155.             w2 = pwUTF16[1]; 
  156.             if( w2 >= 0xDC00 && w2 <= 0xDFFF ) 
  157.             { 
  158.                 dwUCS4 = (w2 & 0x03FF) + (((w1 & 0x03FF) + 0x40) << 10); 
  159.                 return 2; 
  160.             } 
  161.         } 
  162.  
  163.         return 0;   // 非法UTF16编码     
  164.     } 
  165.     else 
  166.     { 
  167.         dwUCS4 = w1; 
  168.         return 1; 
  169.     } 
  170.  
  171. // 转换UTF8字符串到UTF16字符串 
  172. INT CUnicodeConverter::UTF8Str_To_UTF16Str( const BYTE* pbszUTF8Str, WORD* pwszUTF16Str ) 
  173.     INT     iNum, iLen; 
  174.     DWORD   dwUCS4; 
  175.  
  176.     if( pbszUTF8Str == NULL ) 
  177.     {   // 参数错误 
  178.         return 0; 
  179.     } 
  180.  
  181.     iNum = 0;   // 统计有效字符个数 
  182.     while( *pbszUTF8Str ) 
  183.     {   // UTF8编码转换为UCS4编码 
  184.         iLen = UTF8_To_UCS4( pbszUTF8Str, dwUCS4 ); 
  185.         if( iLen == 0 ) 
  186.         {   // 非法的UTF8编码 
  187.             return 0; 
  188.         } 
  189.  
  190.         pbszUTF8Str += iLen; 
  191.  
  192.         // UCS4编码转换为UTF16编码 
  193.         iLen = UCS4_To_UTF16( dwUCS4, pwszUTF16Str ); 
  194.         if( iLen == 0 ) 
  195.         { 
  196.             return 0; 
  197.         } 
  198.  
  199.         if( pwszUTF16Str != NULL ) 
  200.         { 
  201.             pwszUTF16Str += iLen; 
  202.         } 
  203.          
  204.         iNum += iLen; 
  205.     } 
  206.  
  207.     if( pwszUTF16Str != NULL ) 
  208.     { 
  209.         *pwszUTF16Str = 0;  // 写入字符串结束标记 
  210.     } 
  211.  
  212.     return iNum; 
  213.  
  214. // 转换UTF16字符串到UTF8字符串 
  215. INT CUnicodeConverter::UTF16Str_To_UTF8Str( const WORD* pwszUTF16Str, BYTE* pbszUTF8Str ) 
  216.     INT     iNum, iLen; 
  217.     DWORD   dwUCS4; 
  218.  
  219.     if( pwszUTF16Str == NULL ) 
  220.     {   // 参数错误 
  221.         return 0; 
  222.     } 
  223.  
  224.     iNum = 0; 
  225.     while( *pwszUTF16Str ) 
  226.     {   // UTF16编码转换为UCS4编码 
  227.         iLen = UTF16_To_UCS4( pwszUTF16Str, dwUCS4 ); 
  228.         if( iLen == 0 ) 
  229.         {   // 非法的UTF16编码 
  230.             return 0;    
  231.         } 
  232.          
  233.         pwszUTF16Str += iLen; 
  234.  
  235.         // UCS4编码转换为UTF8编码 
  236.         iLen = UCS4_To_UTF8( dwUCS4, pbszUTF8Str ); 
  237.         if( iLen == 0 ) 
  238.         { 
  239.             return 0; 
  240.         } 
  241.  
  242.         if( pbszUTF8Str != NULL ) 
  243.         { 
  244.             pbszUTF8Str += iLen; 
  245.         } 
  246.          
  247.         iNum += iLen; 
  248.     } 
  249.  
  250.     if( pbszUTF8Str != NULL ) 
  251.     { 
  252.         *pbszUTF8Str = 0;   // 写入字符串结束标记 
  253.     } 
  254.  
  255.     return iNum; 
  256.  
  257. /* -------------------------------------------------------------
  258.                     C文件写入操作
  259.    ------------------------------------------------------------- */ 
  260.  
  261. // 向文件中输出UTF8编码 
  262. UINT CUnicodeConverter::Print_UTF8_By_UCS4( FILE* out, DWORD dwUCS4 ) 
  263.     INT     iLen; 
  264.     BYTE    abUTF8[8]; 
  265.  
  266.     if( out == NULL ) 
  267.     { 
  268.         return 0; 
  269.     } 
  270.  
  271.     iLen = UCS4_To_UTF8( dwUCS4, abUTF8 ); 
  272.     if( iLen == 0 )return 0; 
  273.  
  274.     fwrite( abUTF8, 1, iLen, out ); 
  275.  
  276.     return iLen; 
  277.  
  278. // 向文件中输出UTF16编码 
  279. UINT CUnicodeConverter::Print_UTF16_By_UCS4( FILE* out, DWORD dwUCS4, BOOL isBigEndian ) 
  280.     INT     i, iLen; 
  281.     WORD    wCode, awUTF16[2]; 
  282.  
  283.     if( out == NULL ) 
  284.     { 
  285.         return 0; 
  286.     } 
  287.  
  288.     iLen = UCS4_To_UTF16( dwUCS4, awUTF16 ); 
  289.     if( iLen == 0 )return 0; 
  290.  
  291.     for( i = 0; i < iLen; i++ ) 
  292.     { 
  293.         wCode = awUTF16[i]; 
  294.         if( isBigEndian ) 
  295.         { 
  296.             fputc( wCode >> 8, out ); // 输出高位 
  297.             fputc( wCode & 0xFF, out ); // 输出低位 
  298.         } 
  299.         else 
  300.         { 
  301.             fputc( wCode & 0xFF, out ); // 输出低位 
  302.             fputc( wCode >> 8, out ); // 输出高位 
  303.         } 
  304.     } 
  305.  
  306.     return (iLen << 1); 
  307.  
  308. // 将UTF16字符串以UTF8编码输出到文件中 
  309. UINT CUnicodeConverter::Print_UTF8Str_By_UTF16Str( FILE* out, const WORD* pwszUTF16Str ) 
  310.     INT     iCount, iLen; 
  311.     DWORD   dwUCS4; 
  312.  
  313.     if( (out == NULL) || (pwszUTF16Str == NULL) ) 
  314.     { 
  315.         return 0; 
  316.     } 
  317.  
  318.     iCount = 0; 
  319.     while( *pwszUTF16Str ) 
  320.     {   // 将UTF16编码转换成UCS4编码 
  321.         iLen = UTF16_To_UCS4( pwszUTF16Str, dwUCS4 ); 
  322.         if( iLen == 0 ) 
  323.         { 
  324.             break
  325.         } 
  326.  
  327.         pwszUTF16Str += iLen; 
  328.  
  329.         // 向文件中输出UTF8编码 
  330.         iCount += Print_UTF8_By_UCS4( out, dwUCS4 ); 
  331.     } 
  332.  
  333.     return iCount;  // 输出的字节数 
  334.  
  335. // 将UTF8字符串以UTF16编码输出到文件中 
  336. UINT CUnicodeConverter::Print_UTF16Str_By_UTF8Str( FILE* out, const BYTE* pbszUTF8Str, BOOL isBigEndian ) 
  337.     INT     iCount, iLen; 
  338.     DWORD   dwUCS4; 
  339.  
  340.     if( (out == NULL) || (pbszUTF8Str == NULL) ) 
  341.     { 
  342.         return 0; 
  343.     } 
  344.  
  345.     iCount = 0; 
  346.     while( *pbszUTF8Str ) 
  347.     {   // 将UTF16编码转换成UCS4编码 
  348.         iLen = UTF8_To_UCS4( pbszUTF8Str, dwUCS4 ); 
  349.         if( iLen == 0 ) 
  350.         { 
  351.             break
  352.         } 
  353.  
  354.         pbszUTF8Str += iLen; 
  355.  
  356.         // 向文件中输出UTF8编码 
  357.         iCount += Print_UTF16_By_UCS4( out, dwUCS4, isBigEndian ); 
  358.     } 
  359.  
  360.     return iCount;  // 输出的字节数 
  361.  
  362. // 向文件中输出UTF8字节序标记 
  363. UINT CUnicodeConverter::Print_UTF8_BOM( FILE* out ) 
  364.     if( out == NULL ) 
  365.     { 
  366.         return 0; 
  367.     } 
  368.  
  369.     fputc( 0xEF, out ); 
  370.     fputc( 0xBB, out ); 
  371.     fputc( 0xBF, out ); 
  372.  
  373.     return 3; 
  374.  
  375. // 向文件中输出UTF16字节序标记 
  376. UINT CUnicodeConverter::Print_UTF16_BOM( FILE* out, BOOL isBigEndian ) 
  377.     if( out == NULL ) 
  378.     { 
  379.         return 0; 
  380.     } 
  381.  
  382.     if( isBigEndian ) 
  383.     { 
  384.         fputc( 0xFE, out ); 
  385.         fputc( 0xFF, out ); 
  386.     } 
  387.     else 
  388.     { 
  389.         fputc( 0xFF, out ); 
  390.         fputc( 0xFE, out ); 
  391.     } 
  392.  
  393.     return 2; 
  394.  
  395. /* -------------------------------------------------------------
  396.                     C++流输出操作
  397.    ------------------------------------------------------------- */ 
  398.  
  399. // 向流中输出UTF8编码 
  400. UINT CUnicodeConverter::Print_UTF8_By_UCS4( ostream& os, DWORD dwUCS4 ) 
  401.     INT     iLen; 
  402.     BYTE    abUTF8[8]; 
  403.  
  404.     if( !os )return 0; 
  405.      
  406.     iLen = UCS4_To_UTF8( dwUCS4, abUTF8 ); 
  407.     if( iLen == 0 )return 0; 
  408.  
  409.     os.write( reinterpret_cast<CHAR*>(abUTF8), iLen ); 
  410.  
  411.     return iLen;     
  412.  
  413. // 向流中输出UTF16编码 
  414. UINT CUnicodeConverter::Print_UTF16_By_UCS4( ostream& os, DWORD dwUCS4, BOOL isBigEndian ) 
  415.     INT     i, iLen; 
  416.     WORD    wCode, awUTF16[2]; 
  417.  
  418.     if( !os )return 0; 
  419.      
  420.     iLen = UCS4_To_UTF16( dwUCS4, awUTF16 ); 
  421.     if( iLen == 0 )return 0; 
  422.  
  423.     for( i = 0; i < iLen; i++ ) 
  424.     { 
  425.         wCode = awUTF16[i]; 
  426.         if( isBigEndian ) 
  427.         { 
  428.             os.put( wCode >> 8 );     // 输出高位 
  429.             os.put( wCode & 0xFF );     // 输出低位 
  430.         } 
  431.         else 
  432.         { 
  433.             os.put( wCode & 0xFF );     // 输出低位 
  434.             os.put( wCode >> 8 );     // 输出高位 
  435.         } 
  436.     } 
  437.  
  438.     return (iLen << 1); 
  439.  
  440. // 将UTF16字符串以UTF8编码输出到流中 
  441. UINT CUnicodeConverter::Print_UTF8Str_By_UTF16Str( ostream& os, const WORD* pwszUTF16Str ) 
  442.     INT     iCount, iLen; 
  443.     DWORD   dwUCS4; 
  444.  
  445.     if( !os || (pwszUTF16Str == NULL) )return 0; 
  446.      
  447.     iCount = 0; 
  448.     while( *pwszUTF16Str ) 
  449.     {   // 将UTF16编码转换成UCS4编码 
  450.         iLen = UTF16_To_UCS4( pwszUTF16Str, dwUCS4 ); 
  451.         if( iLen == 0 ) 
  452.         { 
  453.             break
  454.         } 
  455.  
  456.         pwszUTF16Str += iLen; 
  457.  
  458.         // 向流中输出UTF8编码 
  459.         iCount += Print_UTF8_By_UCS4( os, dwUCS4 ); 
  460.     } 
  461.  
  462.     return iCount;  // 输出的字节数 
  463.  
  464. // 将UTF8字符串以UTF16编码输出到流中 
  465. UINT CUnicodeConverter::Print_UTF16Str_By_UTF8Str( ostream& os, const BYTE* pbszUTF8Str, BOOL isBigEndian ) 
  466.     INT     iCount, iLen; 
  467.     DWORD   dwUCS4; 
  468.  
  469.     if( !os || (pbszUTF8Str == NULL) )return 0; 
  470.  
  471.     iCount = 0; 
  472.     while( *pbszUTF8Str ) 
  473.     {   // 将UTF16编码转换成UCS4编码 
  474.         iLen = UTF8_To_UCS4( pbszUTF8Str, dwUCS4 ); 
  475.         if( iLen == 0 ) 
  476.         { 
  477.             break
  478.         } 
  479.  
  480.         pbszUTF8Str += iLen; 
  481.  
  482.         // 向流中输出UTF8编码 
  483.         iCount += Print_UTF16_By_UCS4( os, dwUCS4, isBigEndian ); 
  484.     } 
  485.  
  486.     return iCount;  // 输出的字节数 
  487.  
  488. // 向流中输出UTF8字节序标记 
  489. UINT CUnicodeConverter::Print_UTF8_BOM( ostream& os ) 
  490.     if( !os )return 0; 
  491.      
  492.     os.put( 0xEF ); 
  493.     os.put( 0xBB ); 
  494.     os.put( 0xBF ); 
  495.  
  496.     return 3;    
  497.  
  498. // 向流中输出UTF16字节序标记 
  499. UINT CUnicodeConverter::Print_UTF16_BOM( ostream& os, BOOL isBigEndian ) 
  500.     if( !os )return 0; 
  501.      
  502.     if( isBigEndian ) 
  503.     { 
  504.         os.put( 0xFE ); 
  505.         os.put( 0xFF ); 
  506.     } 
  507.     else 
  508.     { 
  509.         os.put( 0xFF ); 
  510.         os.put( 0xFE ); 
  511.     } 
  512.  
  513.     return 2; 
  514.  
  515. /* ------------------------------
  516.                 END
  517.    ------------------------------ */ 

你可能感兴趣的:(OS,File,null,存储,byte,2010)