首页 > 代码库 > 指定存储文件的编码格式(上)

指定存储文件的编码格式(上)

 

终于搞完了,内容稍微有点多分为两篇把。

《指定存储文件的编码格式(上)》

《指定存储文件的编码格式(下)》

 

本篇为上篇。

 

主流的文件编码包括:UTF8\UTF8-WITHOUT-BOM\UTF16LE\UTF16BE\ANSI等。

中文的windows操作系统默认使用就是ANSI编码。

各种编码的主要规则大家可以去wiki网站、unicode.org网站等查看。

本文的上篇和下篇都采用windows函数WideCharToMultiByte和MultiByteToWideChar为基础进行编写的。

本文的上篇和下篇主要完成从指定文件A中读取数据,输出到指定编码的文件B中。

之所以分成上下两篇主要是下篇是对上篇的改进和优化。

本篇源码主要片段:

   1 // test__OutputUtf8File.cpp : 定义控制台应用程序的入口点。   2 //   3    4 #include "stdafx.h"   5 #include <windows.h>   6 #include <string>   7 #include <iostream>   8    9 #define UTF8_SIGN 3  10 #define UTF16_SIGN 2  11   12   13   14 //************************************  15 // Method:    Utf16leFileToUtf8File  16 // FullName:  Utf16leFileToUtf8File  17 // Access:    public   18 // Returns:   BOOL  19 // Qualifier:将lpUtf16leFile文件内容写入到lpUtf8File文件中  20 // Parameter: CONST LPTSTR lpUtf16leFile:输入文件utf16le编码  21 // Parameter: CONST LPTSTR lpUtf8File:输出文件为utf8-with-BOM编码  22 // *注:lpUtf16leFile文件只读;lpUtf8File文件总是创建或覆盖  23 //************************************  24 BOOL Utf16leFileToUtf8File(CONST LPTSTR lpUtf16leFile, CONST LPTSTR lpUtf8File)  25 {  26     HANDLE hUtf16leFile = NULL;  27     HANDLE hUtf8File = NULL;  28   29   30     //create file  31     hUtf16leFile = ::CreateFile(lpUtf16leFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  32     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf16leFile)  33     {  34         int errLogNumber = GetLastError();  35         printf_s("error number:%d\n", errLogNumber);  36         return FALSE;  37     }  38   39   40     //read UTF16LE encode file content  41     LPWSTR lpReadContentByUTF16 = NULL;  42     DWORD cbReadContentByUTF16 = 0;  43     DWORD cbPreReadContentByUTF16 = 0;  44     DWORD cchReadContentByUTF16 = 0;  45   46     cbReadContentByUTF16 = SetFilePointer(hUtf16leFile, 0, NULL, FILE_END);  47     if (INVALID_SET_FILE_POINTER == cbReadContentByUTF16)  48     {  49         int errLogNumber = GetLastError();  50         printf_s("error number:%d\n", errLogNumber);  51         ::CloseHandle(hUtf16leFile);  52         return FALSE;  53     }  54     lpReadContentByUTF16 = (WCHAR *)malloc(cbReadContentByUTF16);  55     if (NULL == lpReadContentByUTF16)  56     {  57         printf_s("malloc error\n");  58         ::CloseHandle(hUtf16leFile);  59         return FALSE;  60     }  61     ZeroMemory(lpReadContentByUTF16, cbReadContentByUTF16);  62     SetFilePointer(hUtf16leFile, 0, NULL, FILE_BEGIN);  63     if (FALSE == ReadFile(hUtf16leFile, lpReadContentByUTF16, cbReadContentByUTF16, &cbPreReadContentByUTF16, NULL))  64     {  65         int errLogNumber = GetLastError();  66         printf_s("error number:%d\n", errLogNumber);  67         free(lpReadContentByUTF16);  68         ::CloseHandle(hUtf16leFile);  69         return FALSE;  70     }  71     cchReadContentByUTF16 = ((cbReadContentByUTF16 % sizeof(WCHAR)) != 0 ? (cbReadContentByUTF16 / sizeof(WCHAR) + 1) : (cbReadContentByUTF16 / sizeof(WCHAR)));  72   73   74     //transform encode  75     LPSTR lpWriteContentByUTF8 = NULL;  76     DWORD cchWriteContentByUTF8 = 0;  77     DWORD cbWriteContentByUTF8 = 0;  78     DWORD cbPreWriteContentByUTF8 = 0;  79   80     cbWriteContentByUTF8 = ((cbReadContentByUTF16 % sizeof(WCHAR)) != 0 ? (cbReadContentByUTF16 + sizeof(WCHAR)) : (cbReadContentByUTF16));  81     cchWriteContentByUTF8 = cchReadContentByUTF16;  82     lpWriteContentByUTF8 = (CHAR *)malloc(cbWriteContentByUTF8);  83     if (NULL == lpWriteContentByUTF8)  84     {  85         printf_s("malloc error\n");  86         free(lpReadContentByUTF16);  87         ::CloseHandle(hUtf16leFile);  88         return FALSE;  89     }  90     ZeroMemory(lpWriteContentByUTF8, cbWriteContentByUTF8);  91     if (0 == WideCharToMultiByte(CP_UTF8, 0, lpReadContentByUTF16, cchReadContentByUTF16, lpWriteContentByUTF8, cbWriteContentByUTF8, NULL, NULL))  92     {  93         printf_s("transform error\n");  94         free(lpReadContentByUTF16);  95         free(lpWriteContentByUTF8);  96         ::CloseHandle(hUtf16leFile);  97         return FALSE;  98     }  99  100  101     //write UTF8 encode file content 102     hUtf8File = ::CreateFile(lpUtf8File, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 103     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf8File) 104     { 105         printf("Terminal failure: Unable to write to file.\n"); 106         free(lpReadContentByUTF16); 107         free(lpWriteContentByUTF8); 108         ::CloseHandle(hUtf16leFile); 109         return FALSE; 110     } 111     for (int i = 0; i != cbWriteContentByUTF8; ++i) 112     { 113         if (TEXT(\0)==lpWriteContentByUTF8[i]) 114         { 115             cchWriteContentByUTF8 = i; 116             //lpWriteContentByUTF8[i] = 0;//设置结束符,但是utf8好像不用把 117             break; 118         } 119     } 120     SetFilePointer(hUtf8File, 0, NULL, FILE_BEGIN); 121     if (FALSE == WriteFile(hUtf8File, lpWriteContentByUTF8, cchWriteContentByUTF8, &cbPreWriteContentByUTF8, NULL)) 122     { 123         int errLogNumber = GetLastError(); 124         printf_s("error number:%d\n", errLogNumber); 125         free(lpReadContentByUTF16); 126         free(lpWriteContentByUTF8); 127         ::CloseHandle(hUtf16leFile); 128         return FALSE; 129     } 130  131  132     //release resource 133     free(lpReadContentByUTF16); 134     free(lpWriteContentByUTF8); 135     ::CloseHandle(hUtf16leFile); 136     ::CloseHandle(hUtf8File); 137  138     return TRUE; 139  140 } 141  142 //************************************ 143 // Method:    Utf16leFileToUtf8NoBOMFile 144 // FullName:  Utf16leFileToUtf8NoBOMFile 145 // Access:    public  146 // Returns:   BOOL 147 // Qualifier:将lpUtf16leFile文件内容写入到lpUtf8NoBOMFile文件中 148 // Parameter: CONST LPTSTR lpUtf16leFile:输入文件utf16le编码 149 // Parameter: CONST LPTSTR lpUtf8NoBOMFile:输出文件为utf8-without-BOM编码 150 // *注:lpUtf16leFile文件只读;lpUtf8NoBOMFile文件总是创建或覆盖 151 //************************************ 152 BOOL Utf16leFileToUtf8NoBOMFile(CONST LPTSTR lpUtf16leFile, CONST LPTSTR lpUtf8NoBOMFile) 153 { 154     HANDLE hUtf16leFile = NULL; 155     HANDLE hUtf8NoBOMFile = NULL; 156  157  158     //create UTF16LE file 159     hUtf16leFile = ::CreateFile(lpUtf16leFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 160     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf16leFile) 161     { 162         int errLogNumber = GetLastError(); 163         printf_s("error number:%d\n", errLogNumber); 164         return FALSE; 165     } 166  167  168     //read UTF16LE encode file content 169     LPWSTR lpReadContentByUTF16 = NULL; 170     DWORD cbReadContentByUTF16 = 0; 171     DWORD cbPreReadContentByUTF16 = 0; 172     DWORD cchReadContentByUTF16 = 0; 173  174     cbReadContentByUTF16 = SetFilePointer(hUtf16leFile, 0, NULL, FILE_END); 175     if (INVALID_SET_FILE_POINTER == cbReadContentByUTF16) 176     { 177         int errLogNumber = GetLastError(); 178         printf_s("error number:%d\n", errLogNumber); 179         ::CloseHandle(hUtf16leFile); 180         return FALSE; 181     } 182     lpReadContentByUTF16 = (WCHAR *)malloc(cbReadContentByUTF16); 183     if (NULL == lpReadContentByUTF16) 184     { 185         printf_s("malloc error\n"); 186         ::CloseHandle(hUtf16leFile); 187         return FALSE; 188     } 189     ZeroMemory(lpReadContentByUTF16, cbReadContentByUTF16); 190     SetFilePointer(hUtf16leFile, 0, NULL, FILE_BEGIN); 191     if (FALSE == ReadFile(hUtf16leFile, lpReadContentByUTF16, cbReadContentByUTF16, &cbPreReadContentByUTF16, NULL)) 192     { 193         int errLogNumber = GetLastError(); 194         printf_s("error number:%d\n", errLogNumber); 195         free(lpReadContentByUTF16); 196         ::CloseHandle(hUtf16leFile); 197         return FALSE; 198     } 199     cchReadContentByUTF16 = ((cbReadContentByUTF16 % sizeof(WCHAR)) != 0 ? (cbReadContentByUTF16 / sizeof(WCHAR) + 1) : (cbReadContentByUTF16 / sizeof(WCHAR))); 200  201  202     //transform encode 203     LPSTR lpWriteContentByUTF8 = NULL; 204     DWORD cchWriteContentByUTF8 = 0; 205     DWORD cbWriteContentByUTF8 = 0; 206     DWORD cbPreWriteContentByUTF8 = 0; 207  208     cbWriteContentByUTF8 = ((cbReadContentByUTF16 % sizeof(WCHAR)) != 0 ? (cbReadContentByUTF16 + sizeof(WCHAR)) : (cbReadContentByUTF16)); 209     cchWriteContentByUTF8 = cchReadContentByUTF16; 210     lpWriteContentByUTF8 = (CHAR *)malloc(cbWriteContentByUTF8); 211     if (NULL == lpWriteContentByUTF8) 212     { 213         printf_s("malloc error\n"); 214         free(lpReadContentByUTF16); 215         ::CloseHandle(hUtf16leFile); 216         return FALSE; 217     } 218     ZeroMemory(lpWriteContentByUTF8, cbWriteContentByUTF8); 219     if (0 == WideCharToMultiByte(CP_UTF8, 0, lpReadContentByUTF16, cchReadContentByUTF16, lpWriteContentByUTF8, cbWriteContentByUTF8, NULL, NULL)) 220     { 221         printf_s("transform error\n"); 222         free(lpReadContentByUTF16); 223         free(lpWriteContentByUTF8); 224         ::CloseHandle(hUtf16leFile); 225         return FALSE; 226     } 227  228  229     //write UTF8NoBOM encode file content 230     LPSTR lpWriteContentByUTF8NOBOM = NULL; 231     DWORD cbWriteContentByUTF8NOBOM = 0; 232  233     hUtf8NoBOMFile = ::CreateFile(lpUtf8NoBOMFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 234     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf8NoBOMFile) 235     { 236         printf("Terminal failure: Unable to write to file.\n"); 237         free(lpReadContentByUTF16); 238         free(lpWriteContentByUTF8); 239         ::CloseHandle(hUtf16leFile); 240         return FALSE; 241     } 242     for (int i = 0; i != cbWriteContentByUTF8; ++i) 243     { 244         if (TEXT(\0) == lpWriteContentByUTF8[i]) 245         { 246             cbWriteContentByUTF8NOBOM = i - UTF8_SIGN; 247             break; 248         } 249     } 250     lpWriteContentByUTF8NOBOM = (CHAR *)malloc(cbWriteContentByUTF8NOBOM); 251     if (NULL == lpWriteContentByUTF8NOBOM) 252     { 253         printf_s("malloc error\n"); 254         free(lpReadContentByUTF16); 255         free(lpWriteContentByUTF8); 256         ::CloseHandle(hUtf16leFile); 257         return FALSE; 258     } 259     ZeroMemory(lpWriteContentByUTF8NOBOM, cbWriteContentByUTF8NOBOM); 260     CopyMemory(lpWriteContentByUTF8NOBOM, lpWriteContentByUTF8 + UTF8_SIGN, cbWriteContentByUTF8NOBOM); 261     SetFilePointer(hUtf8NoBOMFile, 0, NULL, FILE_BEGIN); 262     if (FALSE == WriteFile(hUtf8NoBOMFile, lpWriteContentByUTF8NOBOM, cbWriteContentByUTF8NOBOM, &cbPreWriteContentByUTF8, NULL)) 263     { 264         int errLogNumber = GetLastError(); 265         printf_s("error number:%d\n", errLogNumber); 266         free(lpReadContentByUTF16); 267         free(lpWriteContentByUTF8); 268         free(lpWriteContentByUTF8NOBOM); 269         ::CloseHandle(hUtf16leFile); 270         return FALSE; 271     } 272  273  274     //release resource 275     free(lpReadContentByUTF16); 276     free(lpWriteContentByUTF8); 277     free(lpWriteContentByUTF8NOBOM); 278     ::CloseHandle(hUtf16leFile); 279     ::CloseHandle(hUtf8NoBOMFile); 280  281     return TRUE; 282  283 } 284  285 //************************************ 286 // Method:    Utf16leFileToUtf8NoBOMFile2 287 // FullName:  Utf16leFileToUtf8NoBOMFile2 288 // Access:    public  289 // Returns:   BOOL 290 // Qualifier: 291 // Parameter: CONST LPTSTR lpUtf16leFile:输入文件utf16le编码 292 // Parameter: CONST LPTSTR lpUtf8NoBOMFile:输出文件为utf8-without-BOM编码 293 // *注:lpUtf16leFile文件只读;lpUtf8NoBOMFile文件总是创建或覆盖 294 //************************************ 295 BOOL Utf16leFileToUtf8NoBOMFile2(CONST LPTSTR lpUtf16leFile, CONST LPTSTR lpUtf8NoBOMFile) 296 { 297     HANDLE hUtf16leFile = NULL; 298     HANDLE hUtf8NoBOMFile = NULL; 299  300  301     //create UTF16LE file 302     hUtf16leFile = ::CreateFile(lpUtf16leFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 303     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf16leFile) 304     { 305         int errLogNumber = GetLastError(); 306         printf_s("error number:%d\n", errLogNumber); 307         return FALSE; 308     } 309  310  311     //read UTF16LE encode file content 312     LPWSTR lpReadContentByUTF16 = NULL; 313     DWORD cbReadContentByUTF16 = 0; 314     DWORD cbPreReadContentByUTF16 = 0; 315     DWORD cchReadContentByUTF16 = 0; 316  317     cbReadContentByUTF16 = SetFilePointer(hUtf16leFile, 0, NULL, FILE_END); 318     if (INVALID_SET_FILE_POINTER == cbReadContentByUTF16) 319     { 320         int errLogNumber = GetLastError(); 321         printf_s("error number:%d\n", errLogNumber); 322         ::CloseHandle(hUtf16leFile); 323         return FALSE; 324     } 325     lpReadContentByUTF16 = (WCHAR *)malloc(cbReadContentByUTF16); 326     if (NULL == lpReadContentByUTF16) 327     { 328         printf_s("malloc error\n"); 329         ::CloseHandle(hUtf16leFile); 330         return FALSE; 331     } 332     ZeroMemory(lpReadContentByUTF16, cbReadContentByUTF16); 333     SetFilePointer(hUtf16leFile, 0, NULL, FILE_BEGIN); 334     if (FALSE == ReadFile(hUtf16leFile, lpReadContentByUTF16, cbReadContentByUTF16, &cbPreReadContentByUTF16, NULL)) 335     { 336         int errLogNumber = GetLastError(); 337         printf_s("error number:%d\n", errLogNumber); 338         free(lpReadContentByUTF16); 339         ::CloseHandle(hUtf16leFile); 340         return FALSE; 341     } 342     cchReadContentByUTF16 = ((cbReadContentByUTF16 % sizeof(WCHAR)) != 0 ? (cbReadContentByUTF16 / sizeof(WCHAR) + 1) : (cbReadContentByUTF16 / sizeof(WCHAR))); 343  344  345     //transform encode 346     LPSTR lpWriteContentByUTF8 = NULL; 347     DWORD cchWriteContentByUTF8 = 0; 348     DWORD cbWriteContentByUTF8 = 0; 349     DWORD cbPreWriteContentByUTF8 = 0; 350  351     cbWriteContentByUTF8 = ((cbReadContentByUTF16 % sizeof(WCHAR)) != 0 ? (cbReadContentByUTF16 + sizeof(WCHAR)) : (cbReadContentByUTF16)); 352     cchWriteContentByUTF8 = cchReadContentByUTF16; 353     lpWriteContentByUTF8 = (CHAR *)malloc(cbWriteContentByUTF8); 354     if (NULL == lpWriteContentByUTF8) 355     { 356         printf_s("malloc error\n"); 357         free(lpReadContentByUTF16); 358         ::CloseHandle(hUtf16leFile); 359         return FALSE; 360     } 361     ZeroMemory(lpWriteContentByUTF8, cbWriteContentByUTF8); 362     if (0 == WideCharToMultiByte(CP_UTF8, 0, lpReadContentByUTF16, cchReadContentByUTF16, lpWriteContentByUTF8, cbWriteContentByUTF8, NULL, NULL)) 363     { 364         printf_s("transform error\n"); 365         free(lpReadContentByUTF16); 366         free(lpWriteContentByUTF8); 367         ::CloseHandle(hUtf16leFile); 368         return FALSE; 369     } 370  371  372     //write UTF8NOBOM file content 373     hUtf8NoBOMFile = ::CreateFile(lpUtf8NoBOMFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 374     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf8NoBOMFile) 375     { 376         printf("Terminal failure: Unable to write to file.\n"); 377         free(lpReadContentByUTF16); 378         free(lpWriteContentByUTF8); 379         ::CloseHandle(hUtf16leFile); 380         return FALSE; 381     } 382     for (int i = 0; i != cbWriteContentByUTF8; ++i) 383     { 384         if (TEXT(\0) == lpWriteContentByUTF8[i]) 385         { 386             cchWriteContentByUTF8 = i; 387             break; 388         } 389     } 390     SetFilePointer(hUtf8NoBOMFile, 0, NULL, FILE_BEGIN); 391     if (FALSE == WriteFile(hUtf8NoBOMFile, lpWriteContentByUTF8 + UTF8_SIGN, cchWriteContentByUTF8 - UTF8_SIGN, &cbPreWriteContentByUTF8, NULL)) 392     { 393         int errLogNumber = GetLastError(); 394         printf_s("error number:%d\n", errLogNumber); 395         free(lpReadContentByUTF16); 396         free(lpWriteContentByUTF8); 397         ::CloseHandle(hUtf16leFile); 398         ::CloseHandle(hUtf8NoBOMFile); 399         return FALSE; 400     } 401  402  403     //release resource 404     free(lpReadContentByUTF16); 405     free(lpWriteContentByUTF8); 406     ::CloseHandle(hUtf16leFile); 407     ::CloseHandle(hUtf8NoBOMFile); 408  409     return TRUE; 410 } 411  412 //************************************ 413 // Method:    Utf8FileToUtf16leFile 414 // FullName:  Utf8FileToUtf16leFile 415 // Access:    public  416 // Returns:   BOOL 417 // Qualifier:将utf8编码格式文件转换为utf16le编码格式文件 418 // Parameter: CONST LPTSTR lpUtf8File:utf8编码格式文件 419 // Parameter: CONST LPTSTR lpUtf16leFile:utf16le编码格式文件 420 //************************************ 421 BOOL Utf8FileToUtf16leFile(CONST LPTSTR lpUtf8File, CONST LPTSTR lpUtf16leFile) 422 { 423     HANDLE hUtf16leFile = NULL; 424     HANDLE hUtf8File = NULL; 425  426  427     //create UTF8 file 428     hUtf8File = ::CreateFile(lpUtf8File, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 429     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf8File) 430     { 431         int errLogNumber = GetLastError(); 432         printf_s("error number:%d\n", errLogNumber); 433         return FALSE; 434     } 435  436  437     //read UTF8 encode file content 438     LPSTR lpReadContentByUTF8 = NULL; 439     DWORD cbReadContentByUTF8 = 0; 440     DWORD cbPreReadContentByUTF8 = 0; 441     DWORD cchReadContentByUTF8 = 0; 442  443     cbReadContentByUTF8 = SetFilePointer(hUtf8File, 0, NULL, FILE_END); 444     if (INVALID_SET_FILE_POINTER == cbReadContentByUTF8) 445     { 446         int errLogNumber = GetLastError(); 447         printf_s("error number:%d\n", errLogNumber); 448         ::CloseHandle(hUtf8File); 449         return FALSE; 450     } 451     lpReadContentByUTF8 = (CHAR *)malloc(cbReadContentByUTF8); 452     if (NULL == lpReadContentByUTF8) 453     { 454         printf_s("malloc error\n"); 455         ::CloseHandle(hUtf8File); 456         return FALSE; 457     } 458     ZeroMemory(lpReadContentByUTF8, cbReadContentByUTF8); 459     SetFilePointer(hUtf8File, 0, NULL, FILE_BEGIN); 460     if (FALSE == ReadFile(hUtf8File, lpReadContentByUTF8, cbReadContentByUTF8, &cbPreReadContentByUTF8, NULL)) 461     { 462         int errLogNumber = GetLastError(); 463         printf_s("error number:%d\n", errLogNumber); 464         free(lpReadContentByUTF8); 465         ::CloseHandle(hUtf8File); 466         return FALSE; 467     } 468     if (sizeof(CHAR) != sizeof(BYTE)) 469     { 470         free(lpReadContentByUTF8); 471         ::CloseHandle(hUtf8File); 472         return FALSE; 473     } 474     cchReadContentByUTF8 = cbReadContentByUTF8; 475  476  477     //transform encode 478     LPWSTR lpWriteContentByUTF16 = NULL; 479     DWORD cchWriteContentByUTF16 = 0; 480     DWORD cbWriteContentByUTF16 = 0; 481     DWORD cbPreWriteContentByUTF16 = 0; 482  483     cbWriteContentByUTF16 = cchReadContentByUTF8 * 2; 484     cchWriteContentByUTF16 = cchReadContentByUTF8; 485     lpWriteContentByUTF16 = (WCHAR *)malloc(cbWriteContentByUTF16); 486     if (NULL == lpWriteContentByUTF16) 487     { 488         printf_s("malloc error\n"); 489         free(lpReadContentByUTF8); 490         ::CloseHandle(hUtf8File); 491         return FALSE; 492     } 493     ZeroMemory(lpWriteContentByUTF16, cbWriteContentByUTF16); 494     if (0 == MultiByteToWideChar(CP_UTF8, 0, lpReadContentByUTF8, cbReadContentByUTF8, lpWriteContentByUTF16, cchWriteContentByUTF16)) 495     { 496         printf_s("transform error\n"); 497         free(lpReadContentByUTF8); 498         free(lpWriteContentByUTF16); 499         ::CloseHandle(hUtf8File); 500         return FALSE; 501     } 502  503  504     //write UTF16LE encode file content 505     hUtf16leFile = ::CreateFile(lpUtf16leFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 506     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf16leFile) 507     { 508         printf("Terminal failure: Unable to write to file.\n"); 509         free(lpReadContentByUTF8); 510         free(lpWriteContentByUTF16); 511         ::CloseHandle(hUtf8File); 512         return FALSE; 513     } 514     for (int i = 0; i != cbWriteContentByUTF16 -1; ++i) 515     { 516         if (0 == lpWriteContentByUTF16[i] && 0 == lpWriteContentByUTF16[i+1]) 517         { 518             cbWriteContentByUTF16 = i; 519             break; 520         } 521     } 522     ////////////////////////////////////////////////////////////////////////// 523  524     //std::wstring wstrText = L"output to utf8 with BOM.\r\n输出到utf8带BOM的文件中。\r\nengli  sh"; 525     //int lgText = wstrText.length(); 526     //int lgText2 = wstrText.size(); 527     //std::cout << lgText << "" << lgText2 << std::endl; 528  529     ////////////////////////////////////////////////////////////////////////// 530     SetFilePointer(hUtf16leFile, 0, NULL, FILE_BEGIN); 531     if (FALSE == WriteFile(hUtf16leFile, lpWriteContentByUTF16, cbWriteContentByUTF16 * sizeof(WCHAR), &cbPreWriteContentByUTF16, NULL)) 532     { 533         int errLogNumber = GetLastError(); 534         printf_s("error number:%d\n", errLogNumber); 535         free(lpReadContentByUTF8); 536         free(lpWriteContentByUTF16); 537         ::CloseHandle(hUtf16leFile); 538         ::CloseHandle(hUtf8File); 539         return FALSE; 540     } 541  542  543     //release resource 544     free(lpReadContentByUTF8); 545     free(lpWriteContentByUTF16); 546     ::CloseHandle(hUtf16leFile); 547     ::CloseHandle(hUtf8File); 548  549     return TRUE; 550  551 } 552  553 BOOL Utf8NoBOMFileToUtf16leFile(CONST LPTSTR lpUtfNoBOM8File, CONST LPTSTR lpUtf16leFile) 554 { 555     return Utf8FileToUtf16leFile(lpUtfNoBOM8File, lpUtf16leFile); 556  557     //HANDLE hUtf16leFile = NULL; 558     //HANDLE hUtf8File = NULL; 559  560  561     ////create UTF8 file 562     //hUtf8File = ::CreateFile(lpUtf8File, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 563     //if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf8File)> 564     //{ 565     //    int errLogNumber = GetLastError(); 566     //    printf_s("error number:%d\n", errLogNumber); 567     //    return FALSE; 568     //} 569  570  571     ////read UTF8 encode file content 572     //LPSTR lpReadContentByUTF8 = NULL; 573     //DWORD cbReadContentByUTF8 = 0; 574     //DWORD cbPreReadContentByUTF8 = 0; 575     //DWORD cchReadContentByUTF8 = 0; 576  577     //cbReadContentByUTF8 = SetFilePointer(hUtf8File, 0, NULL, FILE_END); 578     //if (INVALID_SET_FILE_POINTER == cbReadContentByUTF8) 579     //{ 580     //    int errLogNumber = GetLastError(); 581     //    printf_s("error number:%d\n", errLogNumber); 582     //    ::CloseHandle(hUtf8File); 583     //    return FALSE; 584     //} 585     //lpReadContentByUTF8 = (CHAR *)malloc(cbReadContentByUTF8); 586     //if (NULL == lpReadContentByUTF8) 587     //{ 588     //    printf_s("malloc error\n"); 589     //    ::CloseHandle(hUtf8File); 590     //    return FALSE; 591     //} 592     //ZeroMemory(lpReadContentByUTF8, cbReadContentByUTF8); 593     //SetFilePointer(hUtf8File, 0, NULL, FILE_BEGIN); 594     //if (FALSE == ReadFile(hUtf8File, lpReadContentByUTF8, cbReadContentByUTF8, &cbPreReadContentByUTF8, NULL)) 595     //{ 596     //    int errLogNumber = GetLastError(); 597     //    printf_s("error number:%d\n", errLogNumber); 598     //    free(lpReadContentByUTF8); 599     //    ::CloseHandle(hUtf8File); 600     //    return FALSE; 601     //} 602     //if (sizeof(CHAR) != sizeof(BYTE)) 603     //{ 604     //    free(lpReadContentByUTF8); 605     //    ::CloseHandle(hUtf8File); 606     //    return FALSE; 607     //} 608     //cchReadContentByUTF8 = cbReadContentByUTF8; 609  610  611     ////transform encode 612     //LPWSTR lpWriteContentByUTF16 = NULL; 613     //DWORD cchWriteContentByUTF16 = 0; 614     //DWORD cbWriteContentByUTF16 = 0; 615     //DWORD cbPreWriteContentByUTF16 = 0; 616  617     //cbWriteContentByUTF16 = cchReadContentByUTF8 * 2; 618     //cchWriteContentByUTF16 = cchReadContentByUTF8; 619     //lpWriteContentByUTF16 = (WCHAR *)malloc(cbWriteContentByUTF16); 620     //if (NULL == lpWriteContentByUTF16) 621     //{ 622     //    printf_s("malloc error\n"); 623     //    free(lpReadContentByUTF8); 624     //    ::CloseHandle(hUtf8File); 625     //    return FALSE; 626     //} 627     //ZeroMemory(lpWriteContentByUTF16, cbWriteContentByUTF16); 628     //if (0 == MultiByteToWideChar(CP_UTF8, 0, lpReadContentByUTF8, cbReadContentByUTF8, lpWriteContentByUTF16, cchWriteContentByUTF16)) 629     //{ 630     //    printf_s("transform error\n"); 631     //    free(lpReadContentByUTF8); 632     //    free(lpWriteContentByUTF16); 633     //    ::CloseHandle(hUtf8File); 634     //    return FALSE; 635     //} 636  637  638     ////write UTF16LE encode file content 639     //hUtf16leFile = ::CreateFile(lpUtf16leFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 640     //if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf16leFile)> 641     //{ 642     //    printf("Terminal failure: Unable to write to file.\n"); 643     //    free(lpReadContentByUTF8); 644     //    free(lpWriteContentByUTF16); 645     //    ::CloseHandle(hUtf8File); 646     //    return FALSE; 647     //} 648     //for (int i = 0; i != cbWriteContentByUTF16 - 1; ++i) 649     //{ 650     //    if (0 == lpWriteContentByUTF16[i] && 0 == lpWriteContentByUTF16[i + 1]) 651     //    { 652     //        cbWriteContentByUTF16 = i; 653     //        break; 654     //    } 655     //} 656     //////////////////////////////////////////////////////////////////////////// 657  658     ////std::wstring wstrText = L"output to utf8 with BOM.\r\n输出到utf8带BOM的文件中。\r\nengli  sh"; 659     ////int lgText = wstrText.length(); 660     ////int lgText2 = wstrText.size(); 661     ////std::cout << lgText << "" << lgText2 << std::endl; 662  663     //////////////////////////////////////////////////////////////////////////// 664     //SetFilePointer(hUtf16leFile, 0, NULL, FILE_BEGIN); 665     //if (FALSE == WriteFile(hUtf16leFile, lpWriteContentByUTF16, cbWriteContentByUTF16 * sizeof(WCHAR), &cbPreWriteContentByUTF16, NULL)) 666     //{ 667     //    int errLogNumber = GetLastError(); 668     //    printf_s("error number:%d\n", errLogNumber); 669     //    free(lpReadContentByUTF8); 670     //    free(lpWriteContentByUTF16); 671     //    ::CloseHandle(hUtf16leFile); 672     //    ::CloseHandle(hUtf8File); 673     //    return FALSE; 674     //} 675  676  677     ////release resource 678     //free(lpReadContentByUTF8); 679     //free(lpWriteContentByUTF16); 680     //::CloseHandle(hUtf16leFile); 681     //::CloseHandle(hUtf8File); 682  683     //return TRUE; 684  685 } 686  687 BOOL Utf8FileToUtf8NoBOMFile(CONST LPTSTR lpUtf8File, CONST LPTSTR lpUtf8NoBOMFile) 688 { 689     HANDLE hUtf8NoBOMFile = NULL; 690     HANDLE hUtf8File = NULL; 691  692  693     //create file 694     hUtf8File = ::CreateFile(lpUtf8File, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 695     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf8File) 696     { 697         int errLogNumber = GetLastError(); 698         printf_s("error number:%d\n", errLogNumber); 699         return FALSE; 700     } 701  702  703     //read UTF8 encode file content 704     LPSTR lpReadContentByUTF8 = NULL; 705     DWORD cbReadContentByUTF8 = 0; 706     DWORD cbPreReadContentByUTF8 = 0; 707     DWORD cchReadContentByUTF8 = 0; 708  709     cbReadContentByUTF8 = SetFilePointer(hUtf8File, 0, NULL, FILE_END); 710     if (INVALID_SET_FILE_POINTER == cbReadContentByUTF8) 711     { 712         int errLogNumber = GetLastError(); 713         printf_s("error number:%d\n", errLogNumber); 714         ::CloseHandle(hUtf8File); 715         return FALSE; 716     } 717     lpReadContentByUTF8 = (CHAR *)malloc(cbReadContentByUTF8); 718     if (NULL == lpReadContentByUTF8) 719     { 720         printf_s("malloc error\n"); 721         ::CloseHandle(hUtf8File); 722         return FALSE; 723     } 724     ZeroMemory(lpReadContentByUTF8, cbReadContentByUTF8); 725     SetFilePointer(hUtf8File, 0, NULL, FILE_BEGIN); 726     if (FALSE == ReadFile(hUtf8File, lpReadContentByUTF8, cbReadContentByUTF8, &cbPreReadContentByUTF8, NULL)) 727     { 728         int errLogNumber = GetLastError(); 729         printf_s("error number:%d\n", errLogNumber); 730         free(lpReadContentByUTF8); 731         ::CloseHandle(hUtf8File); 732         return FALSE; 733     } 734     if (sizeof(CHAR) != sizeof(BYTE)) 735     { 736         free(lpReadContentByUTF8); 737         ::CloseHandle(hUtf8File); 738         return FALSE; 739     } 740     cchReadContentByUTF8 = cbReadContentByUTF8; 741      742  743     //write UTF8NoBOM encode file content 744     LPSTR lpWriteContentByUTF8NoBOM = NULL; 745     DWORD cbWriteContentByUTF8NoBOM = 0; 746     DWORD cbPreWriteContentByUTF8NoBOM = 0; 747     DWORD cchWriteContentByUTF8NoBOM = 0; 748  749     cbWriteContentByUTF8NoBOM = cbReadContentByUTF8 - UTF8_SIGN; 750     lpWriteContentByUTF8NoBOM = (CHAR *)malloc(cbWriteContentByUTF8NoBOM); 751     if (NULL == lpWriteContentByUTF8NoBOM) 752     { 753         printf_s("malloc error\n"); 754         free(lpReadContentByUTF8); 755         ::CloseHandle(hUtf8File); 756         return FALSE; 757     } 758     ZeroMemory(lpWriteContentByUTF8NoBOM, cbWriteContentByUTF8NoBOM); 759  760     CopyMemory(lpWriteContentByUTF8NoBOM, lpReadContentByUTF8 + UTF8_SIGN, cbWriteContentByUTF8NoBOM); 761  762     hUtf8NoBOMFile = ::CreateFile(lpUtf8NoBOMFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 763     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf8NoBOMFile) 764     { 765         printf("Terminal failure: Unable to write to file.\n"); 766         free(lpReadContentByUTF8); 767         free(lpWriteContentByUTF8NoBOM); 768         ::CloseHandle(hUtf8File); 769         return FALSE; 770     } 771     SetFilePointer(hUtf8NoBOMFile, 0, NULL, FILE_BEGIN); 772     if (FALSE == WriteFile(hUtf8NoBOMFile, lpWriteContentByUTF8NoBOM, cbWriteContentByUTF8NoBOM, &cbPreWriteContentByUTF8NoBOM, NULL)) 773     { 774         int errLogNumber = GetLastError(); 775         printf_s("error number:%d\n", errLogNumber); 776         free(lpReadContentByUTF8); 777         free(lpWriteContentByUTF8NoBOM); 778         ::CloseHandle(hUtf8NoBOMFile); 779         ::CloseHandle(hUtf8File); 780         return FALSE; 781     } 782  783  784     //release resource 785     free(lpReadContentByUTF8); 786     free(lpWriteContentByUTF8NoBOM); 787     ::CloseHandle(hUtf8NoBOMFile); 788     ::CloseHandle(hUtf8File); 789  790     return TRUE; 791  792 } 793  794 BOOL Utf8NoBOMFileToUtf8File(CONST LPTSTR lpUtf8NoBOMFile, CONST LPTSTR lpUtf8File) 795 { 796     HANDLE hUtf8NoBOMFile = NULL; 797     HANDLE hUtf8File = NULL; 798  799  800     //create file 801     hUtf8NoBOMFile = ::CreateFile(lpUtf8NoBOMFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 802     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf8NoBOMFile) 803     { 804         int errLogNumber = GetLastError(); 805         printf_s("error number:%d\n", errLogNumber); 806         return FALSE; 807     } 808  809  810     //read UTF8 encode file content 811     LPSTR lpReadContentByUTF8NoBOM = NULL; 812     DWORD cbReadContentByUTF8NoBOM = 0; 813     DWORD cbPreReadContentByUTF8NoBOM = 0; 814     DWORD cchReadContentByUTF8NoBOM = 0; 815  816     cbReadContentByUTF8NoBOM = SetFilePointer(hUtf8NoBOMFile, 0, NULL, FILE_END); 817     if (INVALID_SET_FILE_POINTER == cbReadContentByUTF8NoBOM) 818     { 819         int errLogNumber = GetLastError(); 820         printf_s("error number:%d\n", errLogNumber); 821         ::CloseHandle(hUtf8NoBOMFile); 822         return FALSE; 823     } 824     lpReadContentByUTF8NoBOM = (CHAR *)malloc(cbReadContentByUTF8NoBOM); 825     if (NULL == lpReadContentByUTF8NoBOM) 826     { 827         printf_s("malloc error\n"); 828         ::CloseHandle(hUtf8NoBOMFile); 829         return FALSE; 830     } 831     ZeroMemory(lpReadContentByUTF8NoBOM, cbReadContentByUTF8NoBOM); 832     SetFilePointer(hUtf8NoBOMFile, 0, NULL, FILE_BEGIN); 833     if (FALSE == ReadFile(hUtf8NoBOMFile, lpReadContentByUTF8NoBOM, cbReadContentByUTF8NoBOM, &cbPreReadContentByUTF8NoBOM, NULL)) 834     { 835         int errLogNumber = GetLastError(); 836         printf_s("error number:%d\n", errLogNumber); 837         free(lpReadContentByUTF8NoBOM); 838         ::CloseHandle(hUtf8NoBOMFile); 839         return FALSE; 840     } 841     if (sizeof(CHAR) != sizeof(BYTE)) 842     { 843         free(lpReadContentByUTF8NoBOM); 844         ::CloseHandle(hUtf8NoBOMFile); 845         return FALSE; 846     } 847     cchReadContentByUTF8NoBOM = cbReadContentByUTF8NoBOM; 848  849  850     //write UTF8NoBOM encode file content 851     LPSTR lpWriteContentByUTF8 = NULL; 852     DWORD cbWriteContentByUTF8 = 0; 853     DWORD cbPreWriteContentByUTF8 = 0; 854     DWORD cchWriteContentByUTF8 = 0; 855  856     cbWriteContentByUTF8 = cbReadContentByUTF8NoBOM + UTF8_SIGN; 857     lpWriteContentByUTF8 = (CHAR *)malloc(cbWriteContentByUTF8); 858     if (NULL == lpWriteContentByUTF8) 859     { 860         printf_s("malloc error\n"); 861         free(lpReadContentByUTF8NoBOM); 862         ::CloseHandle(hUtf8NoBOMFile); 863         return FALSE; 864     } 865     ZeroMemory(lpWriteContentByUTF8, cbWriteContentByUTF8); 866  867     lpWriteContentByUTF8[0] = 0xef; 868     lpWriteContentByUTF8[1] = 0xbb; 869     lpWriteContentByUTF8[2] = 0xbf; 870     CopyMemory(lpWriteContentByUTF8 + UTF8_SIGN, lpReadContentByUTF8NoBOM, cbWriteContentByUTF8 - UTF8_SIGN); 871  872     hUtf8File = ::CreateFile(lpUtf8File, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 873     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf8File) 874     { 875         printf("Terminal failure: Unable to write to file.\n"); 876         free(lpWriteContentByUTF8); 877         free(lpReadContentByUTF8NoBOM); 878         ::CloseHandle(hUtf8NoBOMFile); 879         return FALSE; 880     } 881     SetFilePointer(hUtf8File, 0, NULL, FILE_BEGIN); 882     if (FALSE == WriteFile(hUtf8File, lpWriteContentByUTF8, cbWriteContentByUTF8, &cbPreWriteContentByUTF8, NULL)) 883     { 884         int errLogNumber = GetLastError(); 885         printf_s("error number:%d\n", errLogNumber); 886         free(lpWriteContentByUTF8); 887         free(lpReadContentByUTF8NoBOM); 888         ::CloseHandle(hUtf8NoBOMFile); 889         ::CloseHandle(hUtf8File); 890         return FALSE; 891     } 892  893  894     //release resource 895     free(lpWriteContentByUTF8); 896     free(lpReadContentByUTF8NoBOM); 897     ::CloseHandle(hUtf8NoBOMFile); 898     ::CloseHandle(hUtf8File); 899  900     return TRUE; 901  902 } 903  904 BOOL Utf16leFileToUtf16beFile(CONST LPTSTR lpUtf16leFile, CONST LPTSTR lpUtf16beFile) 905 { 906     HANDLE hUtf16leFile = NULL; 907     HANDLE hUtf16beFile = NULL; 908  909  910     //create file 911     hUtf16leFile = ::CreateFile(lpUtf16leFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 912     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf16leFile) 913     { 914         int errLogNumber = GetLastError(); 915         printf_s("error number:%d\n", errLogNumber); 916         return FALSE; 917     } 918  919  920     //read UTF16le encode file content 921     LPBYTE lpReadContentByUTF16le = NULL; 922     DWORD cbReadContentByUTF16le = 0; 923     DWORD cbPreReadContentByUTF16le = 0; 924     DWORD cchReadContentByUTF16le = 0; 925  926     cbReadContentByUTF16le = SetFilePointer(hUtf16leFile, 0, NULL, FILE_END); 927     if (INVALID_SET_FILE_POINTER == cbReadContentByUTF16le) 928     { 929         int errLogNumber = GetLastError(); 930         printf_s("error number:%d\n", errLogNumber); 931         ::CloseHandle(hUtf16leFile); 932         return FALSE; 933     } 934     if (0 != cbReadContentByUTF16le % 2) 935     { 936         printf_s("read byte error\n"); 937         ::CloseHandle(hUtf16leFile); 938         return FALSE; 939     } 940     lpReadContentByUTF16le = (BYTE *)malloc(cbReadContentByUTF16le); 941     if (NULL == lpReadContentByUTF16le) 942     { 943         printf_s("malloc error\n"); 944         ::CloseHandle(hUtf16leFile); 945         return FALSE; 946     } 947     ZeroMemory(lpReadContentByUTF16le, cbReadContentByUTF16le); 948     SetFilePointer(hUtf16leFile, 0, NULL, FILE_BEGIN); 949     if (FALSE == ReadFile(hUtf16leFile, lpReadContentByUTF16le, cbReadContentByUTF16le, &cbPreReadContentByUTF16le, NULL)) 950     { 951         int errLogNumber = GetLastError(); 952         printf_s("error number:%d\n", errLogNumber); 953         free(lpReadContentByUTF16le); 954         ::CloseHandle(hUtf16leFile); 955         return FALSE; 956     } 957     //std::wstring wstrText(lpReadContentByUTF16le); 958     //printf("%s\n", wstrText); 959     if (sizeof(WCHAR) != sizeof(BYTE)*2) 960     { 961         free(lpReadContentByUTF16le); 962         ::CloseHandle(hUtf16leFile); 963         return FALSE; 964     } 965  966  967     //write UTF8NoBOM encode file content 968     LPBYTE lpWriteContentByUTF16be = NULL; 969     DWORD cbWriteContentByUTF16be = 0; 970     DWORD cbPreWriteContentByUTF16be = 0; 971     DWORD cchWriteContentByUTF16be = 0; 972  973     cbWriteContentByUTF16be = cbReadContentByUTF16le; 974     lpWriteContentByUTF16be = (BYTE *)malloc(cbWriteContentByUTF16be); 975     if (NULL == lpWriteContentByUTF16be) 976     { 977         printf_s("malloc error\n"); 978         free(lpReadContentByUTF16le); 979         ::CloseHandle(hUtf16leFile); 980         return FALSE; 981     } 982     ZeroMemory(lpWriteContentByUTF16be, cbWriteContentByUTF16be); 983  984     CopyMemory(lpWriteContentByUTF16be, lpReadContentByUTF16le, cbWriteContentByUTF16be); 985  986     for (DWORD i = 0; i < cbWriteContentByUTF16be; i += 2)//每两值交换 987     { 988         lpWriteContentByUTF16be[i] = lpWriteContentByUTF16be[i] ^ lpWriteContentByUTF16be[i + 1]; 989         lpWriteContentByUTF16be[i + 1] = lpWriteContentByUTF16be[i + 1] ^ lpWriteContentByUTF16be[i]; 990         lpWriteContentByUTF16be[i] = lpWriteContentByUTF16be[i] ^ lpWriteContentByUTF16be[i + 1]; 991         //BYTE hex_ = 0x0; 992         //hex_ = lpWriteContentByUTF16be[i]; 993         ////printf("%x\n", lpWriteContentByUTF16be[i]); 994         //lpWriteContentByUTF16be[i] = lpWriteContentByUTF16be[i + 1]; 995         //lpWriteContentByUTF16be[i + 1] = hex_; 996     } 997  998     hUtf16beFile = ::CreateFile(lpUtf16beFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 999     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hUtf16beFile)1000     {1001         printf("Terminal failure: Unable to write to file.\n");1002         free(lpWriteContentByUTF16be);1003         free(lpReadContentByUTF16le);1004         ::CloseHandle(hUtf16leFile);1005         return FALSE;1006     }1007     SetFilePointer(hUtf16beFile, 0, NULL, FILE_BEGIN);1008     if (FALSE == WriteFile(hUtf16beFile, lpWriteContentByUTF16be, cbWriteContentByUTF16be, &cbPreWriteContentByUTF16be, NULL))1009     {1010         int errLogNumber = GetLastError();1011         printf_s("error number:%d\n", errLogNumber);1012         free(lpWriteContentByUTF16be);1013         free(lpReadContentByUTF16le);1014         ::CloseHandle(hUtf16leFile);1015         ::CloseHandle(hUtf16beFile);1016         return FALSE;1017     }1018 1019 1020     //release resource1021     free(lpWriteContentByUTF16be);1022     free(lpReadContentByUTF16le);1023     ::CloseHandle(hUtf16leFile);1024     ::CloseHandle(hUtf16beFile);1025 1026     return TRUE;1027 1028 }1029 1030 BOOL Utf16beFileToUtf16leFile(CONST LPTSTR lpUtf16beFile, CONST LPTSTR lpUtf16leFile)1031 {1032     return Utf16leFileToUtf16beFile(lpUtf16beFile, lpUtf16leFile);1033 }1034 1035 1036 1037 1038 enum FileCodeType1039 {1040     OTHER = 0,1041     UTF16LE,1042     UTF8,1043     UTF8_NO_BOM,1044     UTF16BE1045 };1046 1047 //************************************1048 // Method:    CodeFileAToCodeFileB1049 // FullName:  CodeFileAToCodeFileB1050 // Access:    public 1051 // Returns:   bool1052 // Qualifier:读取指定编码文件A的内容输出到指定编码文件B1053 // Parameter: CONST LPTSTR lpFileA:输入文件1054 // Parameter: CONST FileCodeType wCodeTypeA:输入文件类型(包括:utf16le\utf16be\utf8\ANSI)1055 // Parameter: CONST LPTSTR lpFileB:输出文件1056 // Parameter: CONST FileCodeType wCodeTypeB:输出文件类型(包括:utf16le\utf16be\utf8\utf8 without BOM\ANSI)1057 //************************************1058 BOOL CodeFileAToCodeFileB(CONST LPTSTR lpFileA, CONST FileCodeType emCodeTypeA, CONST LPTSTR lpFileB, CONST FileCodeType emCodeTypeB)1059 {1060     BOOL bSUCCESS = FALSE;1061     HANDLE hFileA = NULL;1062     HANDLE hFileB = NULL;1063 1064     if (OTHER == emCodeTypeA || OTHER == emCodeTypeB)1065     {1066         return bSUCCESS;1067     }1068     if (NULL == lpFileA || NULL == lpFileB)1069     {1070         return bSUCCESS;1071     }1072 1073     switch (emCodeTypeA)1074     {1075         case UTF16LE:1076         {1077             switch (emCodeTypeB)1078             {1079                 case UTF16BE:1080                 {1081                     return Utf16leFileToUtf16beFile(lpFileA, lpFileB);1082                 }1083                     break;1084                 case UTF8:1085                 {1086                     return Utf16leFileToUtf8File(lpFileA, lpFileB);1087                 }1088                     break;1089                 case UTF8_NO_BOM:1090                 {1091                     return Utf16leFileToUtf8NoBOMFile2(lpFileA, lpFileB);1092                 }1093                     break;1094                 default:;1095             }1096         }1097             break;1098         case UTF8:1099         {1100             switch (emCodeTypeB)1101             {1102                 case UTF16LE:1103                 {1104                     return Utf8FileToUtf16leFile(lpFileA, lpFileB);1105                 }1106                 break;1107                 case UTF16BE:1108                 {1109 1110                 }1111                 break;1112                 case UTF8_NO_BOM:1113                 {1114                     return Utf8FileToUtf8NoBOMFile(lpFileA, lpFileB);1115                 }1116                 break;1117                 default:;1118             }1119         }1120             break;1121         case UTF8_NO_BOM:1122         {1123             switch (emCodeTypeB)1124             {1125                 case UTF16LE:1126                 {1127                     return Utf8NoBOMFileToUtf16leFile(lpFileA, lpFileB);1128                 }1129                 break;1130                 case UTF8:1131                 {1132                     return Utf8NoBOMFileToUtf8File(lpFileA, lpFileB);1133                 }1134                 break;1135                 case UTF16BE:1136                 {1137 1138                 }1139                 break;1140                 default:;1141             }1142         }1143             break;1144         case UTF16BE:1145         {1146             switch (emCodeTypeB)1147             {1148                 case UTF16LE:1149                 {1150                     return Utf16beFileToUtf16leFile(lpFileA, lpFileB);1151                 }1152                 break;1153                 case UTF8:1154                 {1155                     1156                 }1157                 break;1158                 case UTF8_NO_BOM:1159                 {1160 1161                 }1162                 break;1163                 default:;1164             }1165         }1166         break;1167         default:;1168     }1169 1170     return bSUCCESS = TRUE;1171 }1172 1173 1174 1175 1176 void test__BYTETOCHAR();1177 void test__BYTETOWCHAR();1178 1179 int _tmain(int argc, _TCHAR* argv[])1180 {1181 1182 1183 1184     CONST LPTSTR lpInputFileUTF8 = TEXT("input-utf8.txt");1185     CONST LPTSTR lpInputFileUTF16le = TEXT("input-utf16le.txt");1186     CONST LPTSTR lpInputFileUTF16be = TEXT("input-utf16be.txt");1187     CONST LPTSTR lpInputFileUTF8NoBOM = TEXT("input-utf8-no-bom.txt");1188 1189     CONST LPTSTR lpOutputFileUTF8NoBOM = TEXT("output-utf8-no-bom.txt");1190     CONST LPTSTR lpOutputFileUTF8 = TEXT("output-utf8.txt");1191     CONST LPTSTR lpOutputFileUTF16le = TEXT("output-utf16le.txt");1192     CONST LPTSTR lpOutputFileUTF16be = TEXT("output-utf16be.txt");1193 1194 1195     //CodeFileAToCodeFileB(lpInputFileUTF16le, UTF16LE, lpOutputFileUTF8, UTF8);1196     //CodeFileAToCodeFileB(lpInputFileUTF16le, UTF16LE, lpOutputFileUTF8NoBOM, UTF8_NO_BOM);1197     //CodeFileAToCodeFileB(lpInputFileUTF8, UTF8, lpOutputFileUTF8NoBOM, UTF8_NO_BOM);1198     //CodeFileAToCodeFileB(lpInputFileUTF8, UTF8, lpOutputFileUTF16le, UTF16LE);1199     //CodeFileAToCodeFileB(lpInputFileUTF8NoBOM, UTF8_NO_BOM, lpOutputFileUTF16le, UTF16LE);1200     //CodeFileAToCodeFileB(lpInputFileUTF8NoBOM, UTF8_NO_BOM, lpOutputFileUTF8, UTF8);1201     //CodeFileAToCodeFileB(lpInputFileUTF16le, UTF16LE, lpOutputFileUTF16be, UTF16BE);1202     //CodeFileAToCodeFileB(lpInputFileUTF16be, UTF16BE, lpOutputFileUTF16le, UTF16LE);1203 1204 1205 1206 1207     //test__BYTETOCHAR();1208     test__BYTETOWCHAR();1209 1210 1211     return 0;1212 }1213 1214 1215 1216 1217 1218 void test__BYTETOCHAR()1219 {1220     //TEXT("output to utf8 with BOM.\r\n输出到utf8带BOM的文件中。\r\nengli  sh");1221     HANDLE hFileA = NULL;1222     HANDLE hFileB = NULL;1223     LPBYTE lpByte = NULL;1224     INT cbByte = 0;1225     INT cchByte = 0;1226     LPSTR lpChar = NULL;1227     INT cbChar = 0;1228     INT cchChar = 0;1229 1230     hFileA = ::CreateFile(TEXT("input.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);1231     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hFileA) return;1232     cchByte = cbByte = SetFilePointer(hFileA, 0, NULL, FILE_END);1233     if (INVALID_SET_FILE_POINTER  == cbByte) return;1234     lpByte = (BYTE *)malloc(cbByte);1235     if (NULL == lpByte) return;1236     ZeroMemory(lpByte, cbByte);1237     SetFilePointer(hFileA, 0, NULL, FILE_BEGIN);1238     if (FALSE == ReadFile(hFileA, lpByte, cbByte, NULL, NULL)) return;1239 1240     cchChar = cbChar = cbByte;1241     lpChar = (CHAR *)malloc(cbChar);1242     if (NULL == lpChar) return;1243     ZeroMemory(lpChar, cbChar);1244 1245     for (INT i = 0; i != cbByte; ++i)1246     {1247         lpChar[i] = (CHAR)lpByte[i];1248     }1249 1250     //////////////////////////////////////////////////////////////////////////1251 1252     std::string strText(lpChar);1253     printf("%s\n", strText.c_str());1254 1255     //////////////////////////////////////////////////////////////////////////1256 1257     hFileB = ::CreateFile(TEXT("output.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);1258     SetFilePointer(hFileB, 0, NULL, FILE_BEGIN);1259     if (FALSE == WriteFile(hFileB, lpChar, cbChar, NULL, NULL)) return;1260 1261     free(lpByte);1262     free(lpChar);1263     CloseHandle(hFileA);1264     CloseHandle(hFileB);1265 }1266 void test__BYTETOWCHAR()1267 {1268     HANDLE hFileA = NULL;1269     HANDLE hFileB = NULL;1270     LPBYTE lpByte = NULL;1271     INT cbByte = 0;1272     INT cchByte = 0;1273     LPWSTR lpWChar = NULL;1274     INT cbWChar = 0;1275     INT cchWChar = 0;1276 1277     hFileA = ::CreateFile(TEXT("input.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);1278     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hFileA) return;1279     cchByte = cbByte = SetFilePointer(hFileA, 0, NULL, FILE_END);1280     if (INVALID_SET_FILE_POINTER == cbByte) return;1281     lpByte = (BYTE *)malloc(cbByte);1282     if (NULL == lpByte) return;1283     ZeroMemory(lpByte, cbByte);1284     SetFilePointer(hFileA, 0, NULL, FILE_BEGIN);1285     if (FALSE == ReadFile(hFileA, lpByte, cbByte, NULL, NULL)) return;1286 1287     cbWChar = cbByte;1288     cchWChar = cbWChar / sizeof(WCHAR);1289     lpWChar = (WCHAR *)malloc(cbWChar);1290     if (NULL == lpWChar) return;1291     ZeroMemory(lpWChar, cbWChar);1292 1293     CopyMemory(lpWChar, lpByte, cbWChar);1294 1295     //////////////////////////////////////////////////////////////////////////1296 1297     std::wstring strText(lpWChar);1298     wprintf(L"%s\n", strText.c_str());1299 1300     //////////////////////////////////////////////////////////////////////////1301 1302     hFileB = ::CreateFile(TEXT("output.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);1303     SetFilePointer(hFileB, 0, NULL, FILE_BEGIN);1304     if (FALSE == WriteFile(hFileB, lpWChar, cbWChar, NULL, NULL)) return;1305 1306     free(lpByte);1307     free(lpWChar);1308     CloseHandle(hFileA);1309     CloseHandle(hFileB);1310 }1311 void test_CHARTOBYTE()1312 {1313 1314 }1315 void test__WCHARTOBYTE()1316 {1317 1318 }

*注:由于较长建议大家放到编译器里面阅读。具体编码实例放到这里。

 

指定存储文件的编码格式(上)