Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //"File_text.h"
- //CHUYỂN ĐỔI UTF-16 SANG UTF-8
- //hàm chuyển đổi và ghi vào file.
- void chuyendoi();
- //Hàm thực hiện chuyển đổi theo thường hợp.
- //giá trị trả về là trường hợp chuyển đổi.
- int char16tochar8(short ,unsigned char* );
- /**************************************************************************/
- //file cpp
- #include "File_text.h"
- //hàm chuyển đổi và ghi vào file.
- void chuyendoi()
- {
- string name1;
- string name2;//2 chuỗi kí tự sùng để lưu tên file
- cout << "ban hay nhap ten file can chuyen doi: ";//nhập tên file cần chuyển
- NhapTenFile(name1);
- fflush(stdin);
- short a[200];//chuỗi short để lưu dữ lieeuh từ file
- unsigned char* u8 = new unsigned char[3];//lưu tạm thời trước khi lưu vào file
- char BOM1[2] = {0x00, 0x00};//BOM của UTF-16
- char BOM2[3] = {0xEF, 0xBB, 0xBF};//BOM của UTF-8
- fstream fInput;//fstream mở file
- fstream fOutput;//fstream ghi file
- fInput.open(name1, ios_base::in, ios_base::binary);//mở file name1 để đọc theo dạng nhị phân
- if (!fInput)
- cout << "khong mo duoc file.";
- else
- {
- fInput.read((char*)&BOM1, 2*sizeof(char));//đọc BOM của UTF-16
- int i = 0;//biến lưu số lượng phần tử của a
- while(!fInput.eof())//cho chạy đến khi con trỏ về vị trí cuối của file
- {
- fInput.read((char* )&a[i], 2);//đọc file rồi lưu vào mảng a
- i++;//cho i tăng đều
- }
- i--;//giảm i xuống 1
- fInput.close();//đóng file
- cout << "hay nhap ten file can luu ra: ";
- NhapTenFile(name2);//nhập tên file ghi dữ lieeuh ra
- fOutput.open(name2, ios_base::out, ios_base::binary);//mở file đê
- fOutput.write((char*)&BOM2, sizeof(BOM2));//ghi BOM của UTF-8
- for (int j = 0; j < i; j++)//duyệt từng phần tử của a
- {
- int dk = char16tochar8(a[j], u8);//chuyển đổi từ short(UTF16) sang u8 (UTF-8)
- switch(dk)//kiểm tra
- {
- case 1 :
- {
- fOutput.write((const char*)&u8[0], sizeof(char));//lưu vào file
- break;
- }
- case 2 :
- {
- fOutput.write((const char*)&u8[0], sizeof(char));//lưu vào file
- fOutput.write((const char*)&u8[1], sizeof(char));//lưu vào file
- break;//lưu vào file
- }
- case 3 :
- {
- fOutput.write((const char*)&u8[0], sizeof(char));//lưu vào file
- fOutput.write((const char*)&u8[1], sizeof(char));//lưu vào file
- fOutput.write((const char*)&u8[2], sizeof(char));//lưu vào file
- break;
- }
- }
- }
- fOutput.close();//đóng file
- delete []u8;//xóa con trỏ
- }
- }
- //Hàm thực hiện chuyển đổi theo thường hợp.
- //giá trị trả về là trường hợp chuyển đổi.
- int char16tochar8(short a,unsigned char* u8)
- //giá trị đưa vào là short, và output là dạng UTF-8 (mấy byte)
- {
- short h;//biến tạm
- if(a < 128)//trường hợp 1 byte
- {
- u8[0] = unsigned char(a);//bạc giá trị
- return 1;//trả về kết quả là 1
- }
- else if(a < 2048)//trường hợp 2 byte
- {
- u8[1] = unsigned char((a % 64) + 128);//lấy 6 bit cuối và cho bít 8 là 1
- h = a >> 6;//dịch bit qua phải 6 số
- 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
- return 2;//trả về kết quả là 2
- }
- //trường hợp 3 byte
- u8[2] = unsigned char((a % 64) + 128);//lấy 6 bit đầu và cho bít 8 là 1
- h = a >> 6;//dịch bit 6 đơn vị qua phải
- u8[1] = unsigned char((h % 64) + 128);//lấy 6 bit đầu(sau khi dịch bit) và cho bít 8 là 1
- h = h >> 6;//dịch bit 6 đơn vị qua phải
- u8[0] = unsigned char(h + 128 + 64 + 32);// lấy 4 bít cuối cà cho bit 8,7,6 là 1
- return 3;//trả về giá trị là 3
- }
- //hàm main chỉ cần gọi chuyendoi();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement