// 向文件中输出UTF16字节序标记
398
UINT CUnicodeConverter::Print_UTF16_BOM( FILE* out, BOOL isBigEndian )
399
{
400
if( out == NULL )
401
{
402
return 0;
403
}
404
405
if( isBigEndian )
406
{
407
fputc( 0xFE, out );
408
fputc( 0xFF, out );
409
}
410
else
411
{
412
fputc( 0xFF, out );
413
fputc( 0xFE, out );
414
}
415
416
return 2;
417
}
418
419
/* -------------------------------------------------------------
420
C++流输出操作
421
------------------------------------------------------------- */
422
423
// 向流中输出UTF8编码
424
UINT CUnicodeConverter::Print_UTF8_By_UCS4( ostream& os, DWORD dwUCS4 )
425
{
426
INT iLen;
427
BYTE abUTF8[8];
428
429
if( !os )return 0;
430
431
iLen = UCS4_To_UTF8( dwUCS4, abUTF8 );
432
if( iLen == 0 )return 0;
433
434
os.write( reinterpret_cast
435
436
return iLen;
437
}
438
439
// 向流中输出UTF16编码
440
UINT CUnicodeConverter::Print_UTF16_By_UCS4( ostream& os, DWORD dwUCS4, BOOL isBigEndian )
441
{
442
INT i, iLen;
443
WORD wCode, awUTF16[2];
444
445
if( !os )return 0;
446
447
iLen = UCS4_To_UTF16( dwUCS4, awUTF16 );
448
if( iLen == 0 )return 0;
449
450
for( i = 0; i < iLen; i++ )
451
{
452
wCode = awUTF16[i];
453
if( isBigEndian )
454
{
455
os.put( wCode >> 8 ); // 输出高位
456
os.put( wCode & 0xFF ); // 输出低位
457
}
458
else
459
{
460
os.put( wCode & 0xFF ); // 输出低位
461
os.put( wCode >> 8 ); // 输出高位
462
}
463
}
464
465
return (iLen << 1);
466
}
467
468
// 将UTF16字符串以UTF8编码输出到流中
469
UINT CUnicodeConverter::Print_UTF8Str_By_UTF16Str( ostream& os, const WORD* pwszUTF16Str )
470
{
471
INT iCount, iLen;
472
DWORD dwUCS4;
474
if( !os || (pwszUTF16Str == NULL) )return 0;
475
476
iCount = 0;
477
while( *pwszUTF16Str )
478
{ // 将UTF16编码转换成UCS4编码
479
iLen = UTF16_To_UCS4( pwszUTF16Str, dwUCS4 );
480
if( iLen == 0 )
481
{
482
break;
483
}
484
485
pwszUTF16Str += iLen;
486
487
// 向流中输出UTF8编码
488
iCount += Print_UTF8_By_UCS4( os, dwUCS4 );
489
}
490
491
return iCount; // 输出的字节数
492
}
493
494
// 将UTF8字符串以UTF16编码输出到流中
495
UINT CUnicodeConverter::Print_UTF16Str_By_UTF8Str( ostream& os, const BYTE* pbszUTF8Str, BOOL isBigEndian )
496
{
497
INT iCount, iLen;
498
DWORD dwUCS4;
499
500
if( !os || (pbszUTF8Str == NULL) )return 0;
501
502
iCount = 0;
503
while( *pbszUTF8Str )
504
{ // 将UTF16编码转换成UCS4编码
505
iLen = UTF8_To_UCS4( pbszUTF8Str, dwUCS4 );
506
if( iLen == 0 )
507
{
508
break;
509
}
510
511
pbszUTF8Str += iLen;
512
513
// 向流中输出UTF8编码
514
iCount += Print_UTF16_By_UCS4( os, dwUCS4, isBigEndian );
515
}
516
517
return iCount; // 输出的字节数
518
}
519
520
// 向流中输出UTF8字节序标记
521
UINT CUnicodeConverter::Print_UTF8_BOM( ostream& os )
522
{
523
if( !os )return 0;
524
525
os.put( 0xEF );
526
os.put( 0xBB );
527
os.put( 0xBF );
528
529
return 3;
530
}
531
532
// 向流中输出UTF16字节序标记
533
UINT CUnicodeConverter::Print_UTF16_BOM( ostream& os, BOOL isBigEndian )
534
{
535
if( !os )return 0;
536
537
if( isBigEndian )
538
{
539
os.put( 0xFE );
540
os.put( 0xFF );
541
}
542
else
543
{
544
os.put( 0xFF );
545
os.put( 0xFE );
546
}
547
548
retu