C++:UTF-8、UTF-16、UTF-32之间的编码转换(二)

2014-11-24 11:16:16 · 作者: · 浏览: 5

127
写入的字节数
128
*/
129
static UINT Print_UTF16Str_By_UTF8Str( FILE* out, const BYTE* pbszUTF8Str, BOOL isBigEndian = FALSE );
130

131
/*
132
功能:向文件中输出UTF8编码字节序标记
133
返回值:
134
写入的字节数
135
*/
136
static UINT Print_UTF8_BOM( FILE* out );
137

138
/*
139
功能:向文件中输出UTF16编码字节序标记
140
返回值:
141
写入的字节数
142
*/
143
static UINT Print_UTF16_BOM( FILE* out, BOOL isBigEndian = FALSE );
144

145
/* -------------------------------------------------------------
146
C++流输出操作
147
------------------------------------------------------------- */
148
public:
149
/*
150
功能:向流中写入UTF8编码
151
返回值:
152
写入的字节数
153
*/
154
static UINT Print_UTF8_By_UCS4( ostream& os, DWORD dwUCS4 );
155

156
/*
157
功能:向流中写入UTF16编码
158
返回值:
159
写入的字节数
160
*/
161
static UINT Print_UTF16_By_UCS4( ostream& os, DWORD dwUCS4, BOOL isBigEndian = FALSE );
162

163
/*
164
功能:将UTF16字符串以UTF8编码输出到流中
165
返回值:
166
写入的字节数
167
*/
168
static UINT Print_UTF8Str_By_UTF16Str( ostream& os, const WORD* pwszUTF16Str );
169

170
/*
171
功能:将UTF8字符串以UTF16编码输出到流中
172
返回值:
173
写入的字节数
174
*/
175
static UINT Print_UTF16Str_By_UTF8Str( ostream& os, const BYTE* pbszUTF8Str, BOOL isBigEndian = FALSE );
176

177
/*
178
功能:向流中输出UTF8编码字节序标记
179
返回值:
180
写入的字节数
181
*/
182
static UINT Print_UTF8_BOM( ostream& os );
183

184
/*
185
功能:向流中输出UTF16编码字节序标记
186
返回值:
187
写入的字节数
188
*/
189
static UINT Print_UTF16_BOM( ostream& os, BOOL isBigEndian = FALSE );
190
};
191

192
/* ------------------------------
193
END
194
------------------------------ */
UnicodeConverter.cpp

view sourceprint
001
#include "UnicodeConverter.h"
002

003
/* -------------------------------------------------------------
004
内码转换
005
------------------------------------------------------------- */
006

007
// 转换UCS4编码到UTF8编码
008
INT CUnicodeConverter::UCS4_To_UTF8( DWORD dwUCS4, BYTE* pbUTF8 )
009
{
010
const BYTE abPrefix[] = {0, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC};
011
const DWORD adwCodeUp[] = {
012
0x80, // U+00000000 ~ U+0000007F
013
0x800, // U+00000080 ~ U+000007FF
014
0x10000, // U+00000800 ~ U+0000FFFF
015
0x200000, // U+00010000 ~ U+001FFFFF
016
0x4000000, // U+00200000 ~ U+03FFFFFF
017
0x80000000 // U+04000000 ~ U+7FFFFFFF
018
};
019

020
INT i, iLen;
021

022
// 根据UCS4编码范围确定对应的UTF-8编码字节数
023
iLen = sizeof(adwCodeUp) / sizeof(DWORD);
024
for( i = 0; i < iLen; i++ )
025
{
026
if( dwUCS4 < adwCodeUp[i] )
027
{
028
break;
029
}
030
}
031

032
if( i == iLen )return 0; // 无效的UCS4编码
033

034
iLen = i + 1; // UTF-8编码字节数
035
if( pbUTF8 != NULL )
036
{ // 转换为UTF-8编码
037
for( ; i > 0; i-- )
038
{
039
pbUTF8[i] = static_cast((dwUCS4 & 0x3F) | 0x80);
040
dwUCS4 >>= 6;
041
}
042

043
pbUTF8[0] = static_cast(dwUCS4 | abPrefix[iLen - 1]);
044
}
045

046
return iLen;
047
}
048

049
// 转换UTF8编码到UCS4编码
050
INT CUnicodeConverter::UTF8_To_UCS4( const BYTE* pbUTF8, DWORD& dwUCS4 )
051
{
052
INT i, iLen;
053
BYTE b;
054

055
if( pbUTF8 == NULL )
056
{ // 参数错误
057
return 0;
058
}
059

060
b = *pbUTF8++;
061
if( b < 0x80 )
062
{
063
dwUCS4 = b;
064