Page 1 of 1

DOS string to wxString

Posted: Thu Jan 24, 2019 8:05 pm
by cutecode
у меня есть файл в DOS-овской кодировке, со следующим содержимым

Code: Select all

Синтаксическая ошибка в имени файла, имени папки или метке тома.
Как правильно перевести содержимое файла в unicode wxString
делаю так

Code: Select all

			wxFile file(tmp);
			long len = file.Length();
			char* chr = new char[len + 1];
    		
	    	file.Read(chr, len);
		    file.Close();
			*(chr + len) = 0;
			wxString buffer(chr, wxConvWhateverWorks);
			
			if (!buffer.IsEmpty())
			{
				wxMessageBox(buffer.mb_str());
				wxRemoveFile(tmp);
				wxMessageBox(szShell);
				return false;
			}
но вижу кракозябры

Code: Select all

‘Ё­в ЄбЁзҐбЄ п ®иЁЎЄ  ў Ё¬Ґ­Ё д ©« , Ё¬Ґ­Ё Ї ЇЄЁ Ё«Ё ¬ҐвЄҐ ⮬ .

Re: DOS string to wxString

Posted: Thu Jan 24, 2019 9:41 pm
by Kvaz1r
DOS-кодировка это какая? cp866?

Я бы делал так:

Code: Select all

#include <wx/wx.h>
#include <wx/file.h>

class MyFrame : public wxFrame
	{
	public:
		MyFrame() : wxFrame(NULL, wxID_ANY, "Test", wxDefaultPosition, wxSize(600, 400))
			{                                       
			wxBoxSizer* Sizer = new wxBoxSizer( wxVERTICAL );

			m_BTest = new wxButton( this, wxID_ANY, wxT("Test"), wxDefaultPosition, wxDefaultSize, 0 );
			m_BTest->Bind(wxEVT_BUTTON, [&](wxCommandEvent&)
				{
				wxString text;
				wxCSConv conv( wxT( "cp866" ) );
				if (!conv.IsOk())
					{
					wxMessageBox("Не узнаю кодировку \n");
					return;
					}
				wxFileDialog* fileDialog = new wxFileDialog(this);
				if (fileDialog->ShowModal() == wxID_OK)
					{
					wxFile file(fileDialog->GetPath(),wxFile::OpenMode::read);
					if(file.IsOpened())
						{
						file.ReadAll(&text,conv);
						wxMessageBox(text);
						}
					else 
						{
						wxMessageBox("Не могу открыть файл \n");
						}
					}
				fileDialog->Destroy();
				});
			Sizer->Add( m_BTest, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );

			this->SetSizer( Sizer );
			this->Layout();
			this->Centre( wxBOTH );
			}
	protected:
		wxButton* m_BTest;

	};

class MyApp : public wxApp
	{
	public:   
		bool OnInit()
			{
			(new MyFrame)->Show();
			return true;
			}
	}; 
wxIMPLEMENT_APP(MyApp);
а при записи в файл конвертировал уже как UTF8:

Code: Select all

file.Write(text,wxMBConvUTF8());

Re: DOS string to wxString

Posted: Thu Jan 24, 2019 10:36 pm
by cutecode
Спасибо, Братан, выручил

Я так сделал

Code: Select all

	wxFile file(tmp);
	wxString buffer;
	wxCSConv conv(wxT("cp866"));
	if (conv.IsOk())
	{
		file.ReadAll(&buffer, conv);
		wxMessageBox(buffer);
	}