Tôi hiện đang làm việc trên một chương trình MFC đặc biệt phải làm việc với UTF-8. Tại một số điểm, tôi phải ghi dữ liệu UTF-8 vào một tập tin; để làm điều đó, tôi đang sử dụng CFiles và CStrings.UTF-8, CString và CFile? (C++, MFC)
Khi tôi nhận được để viết utf-8 (nhân vật Nga, để được chính xác hơn) dữ liệu vào một tập tin, đầu ra trông giống như
Ðàñïå÷àòàíî:
Ñèñòåìà
Ïðîèçâîäñòâî
và vv Đây là assurely không utf-8. Để đọc dữ liệu này đúng cách, tôi phải thay đổi cài đặt hệ thống của mình; thay đổi các ký tự không phải ASCII thành bảng mã hóa tiếng Nga không hoạt động, nhưng sau đó tất cả các ký tự không phải ascii dựa trên latin của tôi đều thất bại. Dù sao, đó là cách tôi làm điều đó.
CFile CSVFile(m_sCible, CFile::modeCreate|CFile::modeWrite);
CString sWorkingLine;
//Add stuff into sWorkingline
CSVFile.Write(sWorkingLine,sWorkingLine.GetLength());
//Clean sWorkingline and start over
Tôi có thiếu gì đó không? Tôi sẽ sử dụng cái gì khác thay thế? Có một số loại bắt tôi đã bỏ lỡ? Tôi sẽ được điều chỉnh cho sự khôn ngoan và kinh nghiệm của bạn, các lập trình viên đồng nghiệp.
EDIT: Tất nhiên, như tôi vừa hỏi một câu hỏi, cuối cùng tôi tìm thấy điều gì đó có thể thú vị, có thể được tìm thấy here. Nghĩ rằng tôi có thể chia sẻ nó.
EDIT 2:
Được rồi, vì vậy tôi thêm BOM hồ sơ của tôi, mà bây giờ chứa ký tự chineese, có lẽ bởi vì tôi đã không chuyển đổi dòng của tôi sang UTF-8. Để thêm các bom tôi đã làm ...
char BOM[3]={0xEF, 0xBB, 0xBF};
CSVFile.Write(BOM,3);
Và sau đó, tôi đã thêm ...
TCHAR TestLine;
//Convert the line to UTF-8 multibyte.
WideCharToMultiByte (CP_UTF8,0,sWorkingLine,sWorkingLine.GetLength(),TestLine,strlen(TestLine)+1,NULL,NULL);
//Add the line to file.
CSVFile.Write(TestLine,strlen(TestLine)+1);
Nhưng sau đó tôi không thể biên dịch, như tôi không thực sự biết làm thế nào để có được chiều dài của TestLine. strlen dường như không chấp nhận TCHAR. Đã sửa lỗi, sử dụng chiều dài tĩnh là 1000 thay thế.
EDIT 3:
Vì vậy, tôi đã thêm mã này ...
wchar_t NewLine[1000];
wcscpy(NewLine, CT2CW((LPCTSTR) sWorkingLine));
TCHAR* TCHARBuf = new TCHAR[1000];
//Convert the line to UTF-8 multibyte.
WideCharToMultiByte (CP_UTF8,0,NewLine,1000,TCHARBuf,1000,NULL,NULL);
//Find how many characters we have to add
size_t size = 0;
HRESULT hr = StringCchLength(TCHARBuf, MAX_PATH, &size);
//Add the line to the file
CSVFile.Write(TCHARBuf,size);
Nó biên dịch tốt, nhưng khi tôi đi xem thử tập tin mới của tôi, đó là chính xác giống như khi tôi didn' t có tất cả mã mới này (ví dụ: Ðàñïå ÷ àòàíî :). Có vẻ như tôi đã không tiến lên một bước, mặc dù tôi đoán chỉ một điều nhỏ là những gì ngăn cách tôi khỏi chiến thắng.
EDIT 4:
trước đây tôi gỡ bỏ thêm mã, như Nate hỏi, và tôi quyết định sử dụng mã của mình thay vào đó, có nghĩa là bây giờ, khi tôi nhận được để thêm dòng của tôi, tôi có ...
CT2CA outputString(sWorkingLine, CP_UTF8);
//Add line to file.
CSVFile.Write(outputString,::strlen(outputString));
Mọi thứ biên soạn tốt, nhưng các ký tự tiếng Nga được hiển thị là ???????. Đến gần hơn, nhưng vẫn không phải thế. Btw, tôi muốn cảm ơn tất cả những người đã cố gắng/cố gắng giúp tôi, nó được đánh giá cao. Tôi đã bị mắc kẹt trong thời gian này, tôi không thể chờ đợi vấn đề này biến mất.
EDIT cuối cùng (Tôi hy vọng) Bằng cách thay đổi cách đầu tiên tôi nhận được các ký tự UTF-8 (tôi đã mã hóa mà không thực sự biết), đó là sai lầm với cách mới của tôi xuất văn bản, tôi nhận được kết quả chấp nhận được.Bằng cách thêm char UTF-8 BOM vào đầu tệp của tôi, nó có thể được đọc dưới dạng Unicode trong các chương trình khác, như Excel.
Hoan hô! Cảm ơn mọi người!
Bạn sẽ cần sử dụng _tcslen để nhận độ dài cho chuỗi TCHAR. Giống như: \t TCHAR * testTCHAR = _T ("test"); \t int tcharLength = _tcslen (testTCHAR); –
Ngoài ra, nếu bạn cần chuyển đổi chuỗi CString thành chuỗi TCHAR *, hãy thử điều này \t CString testCString = _T ("test"); \t TCHAR * testTCHAR = testCString.GetBuffer(); –
Bạn đang làm việc quá vất vả. Sử dụng 'CT2CA' với tham số thứ hai của' CP_UTF8'. Xem bài đăng của tôi dưới đây. – Nate