240
{ // 非法的UTF16编码
241
return 0;
242
}
243
244
pwszUTF16Str += iLen;
245
246
// UCS4编码转换为UTF8编码
247
iLen = UCS4_To_UTF8( dwUCS4, pbszUTF8Str );
248
if( iLen == 0 )
249
{
250
return 0;
251
}
252
253
if( pbszUTF8Str != NULL )
254
{
255
pbszUTF8Str += iLen;
256
}
257
258
iNum += iLen;
259
}
260
261
if( pbszUTF8Str != NULL )
262
{
263
*pbszUTF8Str = 0; // 写入字符串结束标记
264
}
265
266
return iNum;
267
}
268
269
/* -------------------------------------------------------------
270
C文件写入操作
271
------------------------------------------------------------- */
272
273
// 向文件中输出UTF8编码
274
UINT CUnicodeConverter::Print_UTF8_By_UCS4( FILE* out, DWORD dwUCS4 )
275
{
276
INT iLen;
277
BYTE abUTF8[8];
278
279
if( out == NULL )
280
{
281
return 0;
282
}
283
284
iLen = UCS4_To_UTF8( dwUCS4, abUTF8 );
285
if( iLen == 0 )return 0;
286
287
fwrite( abUTF8, 1, iLen, out );
288
289
return iLen;
290
}
291
292
// 向文件中输出UTF16编码
293
UINT CUnicodeConverter::Print_UTF16_By_UCS4( FILE* out, DWORD dwUCS4, BOOL isBigEndian )
294
{
295
INT i, iLen;
296
WORD wCode, awUTF16[2];
297
298
if( out == NULL )
299
{
300
return 0;
301
}
302
303
iLen = UCS4_To_UTF16( dwUCS4, awUTF16 );
304
if( iLen == 0 )return 0;
305
306
for( i = 0; i < iLen; i++ )
307
{
308
wCode = awUTF16[i];
309
if( isBigEndian )
310
{
311
fputc( wCode >> 8, out ); // 输出高位
312
fputc( wCode & 0xFF, out ); // 输出低位
313
}
314
else
315
{
316
fputc( wCode & 0xFF, out ); // 输出低位
317
fputc( wCode >> 8, out ); // 输出高位
318
319
}
320
321
return (iLen << 1);
322
}
323
324
// 将UTF16字符串以UTF8编码输出到文件中
325
UINT CUnicodeConverter::Print_UTF8Str_By_UTF16Str( FILE* out, const WORD* pwszUTF16Str )
326
{
327
INT iCount, iLen;
328
DWORD dwUCS4;
329
330
if( (out == NULL) || (pwszUTF16Str == NULL) )
331
{
332
return 0;
333
}
334
335
iCount = 0;
336
while( *pwszUTF16Str )
337
{ // 将UTF16编码转换成UCS4编码
338
iLen = UTF16_To_UCS4( pwszUTF16Str, dwUCS4 );
339
if( iLen == 0 )
340
{
341
break;
342
}
343
344
pwszUTF16Str += iLen;
345
346
// 向文件中输出UTF8编码
347
iCount += Print_UTF8_By_UCS4( out, dwUCS4 );
348
}
349
350
return iCount; // 输出的字节数
351
}
352
353
// 将UTF8字符串以UTF16编码输出到文件中
354
UINT CUnicodeConverter::Print_UTF16Str_By_UTF8Str( FILE* out, const BYTE* pbszUTF8Str, BOOL isBigEndian )
355
{
356
INT iCount, iLen;
357
DWORD dwUCS4;
358
359
if( (out == NULL) || (pbszUTF8Str == NULL) )
360
{
361
return 0;
362
}
363
364
iCount = 0;
365
while( *pbszUTF8Str )
366
{ // 将UTF16编码转换成UCS4编码
367
iLen = UTF8_To_UCS4( pbszUTF8Str, dwUCS4 );
368
if( iLen == 0 )
369
{
370
break;
371
}
372
373
pbszUTF8Str += iLen;
374
375
// 向文件中输出UTF8编码
376
iCount += Print_UTF16_By_UCS4( out, dwUCS4, isBigEndian );
377
}
378
379
return iCount; // 输出的字节数
380
}
381
382
// 向文件中输出UTF8字节序标记
383
UINT CUnicodeConverter::Print_UTF8_BOM( FILE* out )
384
{
385
if( out == NULL )
386
{
387
return 0;
388
}
389
390
fputc( 0xEF, out );
391
fputc( 0xBB, out );
392
fputc( 0xBF, out );
393
394
return 3;
395
}
396
3