none
No puedo imprimir en UTF-8 (Unicode) RRS feed

  • Pregunta

  • Hola,  tengo el siguiente còdigo que lo que hace es buscar un archivo e imprimirlo a la impresora conectada en USB (puede variar), pero el problema viene cuando este archivo esta en formato UTF-8 Con caracteres especiales, Simplemente imprime puros garabatos. Haber si ustedes me pueden ayudar o arreglar mi codigo para que pueda imprimir en Unicode. Estuve haciendo pruebas, pero no logro solucionarlo.

    Gracias.

    #include <windows.h>
    #include <stdio.h>
    
    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    typedef std::basic_ifstream<TCHAR> tifstream;
    //typedef std::basic_string<TCHAR> tstring;
    typedef std::basic_string<wchar_t> tstring;
    
    void Outtextxy(HDC hdc,int x,int y,tstring Msg)
    {
    	//TextOut(hdc,x,y,Msg.c_str(),static_cast<int>(Msg.length()));
    	TextOutW(hdc,x,y,Msg.c_str(),static_cast<int>(Msg.length()));
    }
    
    void ShowError(tstring strMsg)
    {
    	MessageBox (NULL,strMsg.c_str(),TEXT("Imprimir"),MB_ICONERROR );
    	exit(1);
    }
    
    void ShowInformation(tstring strText)
    {
    	MessageBox (NULL,strText.c_str(),TEXT("Imprimir"),MB_ICONINFORMATION);
    }
    
    void PrintFile(tifstream& f)
    {
    PRINTDLG pd;
    DOCINFO di;
    wstring strLine;
    int y=300;
    
    memset (&pd, 0, sizeof(PRINTDLG));
    memset (&di, 0, sizeof(DOCINFO));
    
    di.cbSize = sizeof(DOCINFO);
    di.lpszDocName = TEXT("Imprimiendo");
    
    pd.lStructSize = sizeof(PRINTDLG);
    pd.Flags = PD_PAGENUMS | PD_RETURNDC;
    pd.nFromPage = 1;
    pd.nToPage = 1;
    pd.nMinPage = 1;
    pd.nMaxPage = 0xFFFF;
    
    
    if(f.fail())
    	ShowError(TEXT("Error el archivo no se pudo abrir para lectura"));
    
    if (PrintDlg (&pd)){
    	if (pd.hDC){
    		if (StartDoc(pd.hDC, &di) != SP_ERROR){
    			cout << "Imprimiendo...\nEspere un momento" << endl;
    			StartPage (pd.hDC);
    			while(!f.eof()){
    				getline(f,strLine);
    	
    				Outtextxy(pd.hDC,500,y,strLine.c_str());
    				y+=100;
    			}
    			EndPage (pd.hDC);
    			EndDoc (pd.hDC);
    		}
    		else
    			ShowError(TEXT("Error: No se pudo comenzar a imprimir."));
    	}
    	else
    		ShowError(TEXT("Error: No se pudo crear el contexto de dispositivo"));
    }
    else
    	ShowInformation(TEXT("Se cancelo la impresion"));
    	ShowInformation(TEXT("Termino la impresion correctamente."));
    }
    
    int main(int argc,char *argv[])
    {
    
    tifstream in(TEXT("hola.txt")); /* acá va escrito el nombre del archivo que quieres imprimir */
    	
    PrintFile(in);
    in.close();
    return 0;
    }

    Gracias.

    jueves, 11 de abril de 2013 13:34

Todas las respuestas

  • Hasta donde yo sé, Outtextxy es una función de consola del sistema gráfico de Borland C++ (BGI), por lo que lo raro es que te funcione desde Visual C++ y encima en entorno gráfico.

    Asumiendo que todo eso funcione (porque estés en Borland y que esa verisón de la función soporte UNICODE), pueda a probar a pasarle strLine.w_str() a la función, pero son meras conjeturas...


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/

    viernes, 24 de mayo de 2013 12:04
    Moderador