Advertisement
thienlang

Đổi UTF16 -> UTF8

Apr 13th, 2013
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.78 KB | None | 0 0
  1. //"File_text.h"
  2. //CHUYỂN ĐỔI UTF-16 SANG UTF-8
  3.  
  4. //hàm chuyển đổi và ghi vào file.
  5. void chuyendoi();
  6.  
  7. //Hàm thực hiện chuyển đổi theo thường hợp.
  8. //giá trị trả về là trường hợp chuyển đổi.
  9. int char16tochar8(short ,unsigned char* );
  10.  
  11.  
  12. /**************************************************************************/
  13. //file cpp
  14. #include "File_text.h"
  15.  
  16. //hàm chuyển đổi và ghi vào file.
  17. void chuyendoi()
  18. {
  19.     string name1;
  20.     string name2;//2 chuỗi kí tự sùng để lưu tên file
  21.     cout << "ban hay nhap ten file can chuyen doi: ";//nhập tên file cần chuyển
  22.     NhapTenFile(name1);
  23.     fflush(stdin);
  24.  
  25.     short a[200];//chuỗi short để lưu dữ lieeuh từ file
  26.     unsigned char* u8 = new unsigned char[3];//lưu tạm thời trước khi lưu vào file
  27.     char BOM1[2] = {0x00, 0x00};//BOM của UTF-16
  28.     char BOM2[3] = {0xEF, 0xBB, 0xBF};//BOM của UTF-8
  29.     fstream fInput;//fstream mở file
  30.     fstream fOutput;//fstream ghi file
  31.    
  32.    
  33.     fInput.open(name1, ios_base::in, ios_base::binary);//mở file name1 để đọc theo dạng nhị phân
  34.     if (!fInput)
  35.         cout << "khong mo duoc file.";
  36.     else
  37.     {
  38.     fInput.read((char*)&BOM1, 2*sizeof(char));//đọc BOM của UTF-16
  39.    
  40.     int i = 0;//biến lưu số lượng phần tử của a
  41.     while(!fInput.eof())//cho chạy đến khi con trỏ về vị trí cuối của file
  42.     {
  43.         fInput.read((char* )&a[i], 2);//đọc file rồi lưu vào mảng a
  44.         i++;//cho i tăng đều
  45.     }
  46.     i--;//giảm i xuống 1
  47.     fInput.close();//đóng file
  48.    
  49.  
  50.     cout << "hay nhap ten file can luu ra: ";
  51.     NhapTenFile(name2);//nhập tên file ghi dữ lieeuh ra
  52.  
  53.     fOutput.open(name2, ios_base::out, ios_base::binary);//mở file đê
  54.     fOutput.write((char*)&BOM2, sizeof(BOM2));//ghi BOM của UTF-8
  55.  
  56.     for (int j = 0; j < i; j++)//duyệt từng phần tử của a
  57.     {
  58.         int dk = char16tochar8(a[j], u8);//chuyển đổi từ short(UTF16) sang u8 (UTF-8)
  59.         switch(dk)//kiểm tra
  60.         {
  61.         case 1 :
  62.             {
  63.                 fOutput.write((const char*)&u8[0], sizeof(char));//lưu vào file
  64.                 break;
  65.             }
  66.         case 2 :
  67.             {
  68.                 fOutput.write((const char*)&u8[0], sizeof(char));//lưu vào file
  69.                 fOutput.write((const char*)&u8[1], sizeof(char));//lưu vào file
  70.                 break;//lưu vào file
  71.             }
  72.         case 3 :
  73.             {
  74.                 fOutput.write((const char*)&u8[0], sizeof(char));//lưu vào file
  75.                 fOutput.write((const char*)&u8[1], sizeof(char));//lưu vào file
  76.                 fOutput.write((const char*)&u8[2], sizeof(char));//lưu vào file
  77.                 break;
  78.             }
  79.         }
  80.  
  81.     }
  82.     fOutput.close();//đóng file
  83.     delete []u8;//xóa con trỏ
  84.     }
  85.  
  86. }
  87.  
  88.  
  89. //Hàm thực hiện chuyển đổi theo thường hợp.
  90. //giá trị trả về là trường hợp chuyển đổi.
  91. int char16tochar8(short a,unsigned char* u8)
  92. //giá trị đưa vào là short, và output là dạng UTF-8 (mấy byte)
  93. {
  94.     short h;//biến tạm
  95.     if(a < 128)//trường hợp 1 byte
  96.     {
  97.         u8[0] = unsigned char(a);//bạc giá trị
  98.         return 1;//trả về kết quả là 1
  99.     }
  100.     else if(a < 2048)//trường hợp 2 byte
  101.     {
  102.  
  103.         u8[1] = unsigned char((a % 64) + 128);//lấy 6 bit cuối và cho bít 8 là 1
  104.         h = a >> 6;//dịch bit qua phải 6 số
  105.         u8[0] = unsigned char(h + 128 + 64);//lấy các bit còn lại và cho bit 8 và bit 7 là 1
  106.         return 2;//trả về kết quả là 2
  107.     }
  108.     //trường hợp 3 byte
  109.     u8[2] = unsigned char((a % 64) + 128);//lấy 6 bit đầu và cho bít 8 là 1
  110.     h = a >> 6;//dịch bit 6 đơn vị qua phải
  111.     u8[1] = unsigned char((h % 64) + 128);//lấy 6 bit đầu(sau khi dịch bit) và cho bít 8 là 1
  112.     h = h >> 6;//dịch bit 6 đơn vị qua phải
  113.     u8[0] = unsigned char(h + 128 + 64 + 32);// lấy 4 bít cuối cà cho bit 8,7,6 là 1
  114.     return 3;//trả về giá trị là 3
  115. }
  116.  
  117. //hàm main chỉ cần gọi chuyendoi();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement