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
/* ------------------------------
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
040
dwUCS4 >>= 6;
041
}
042
043
pbUTF8[0] = static_cast
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