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

2014-11-24 11:16:16 · 作者: · 浏览: 2
( iLen == 0 )
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