PDA

Ver la Versión Completa : convertir unicode string to char en c++ builder


LuisMiguel
30-09-2012, 22:17:53
Saludos a todos
Necesito convertir un String 'o UnicodeString a un char *

char * a = "Ejemplo"; // El resultado de esto es: "Ejemplo";
String a = "Ejemplo"; // El resultado de esto es: L"Ejemplo";

Como ven la (L) esta delante de lo que me da como resultado,cosa que quisiera eliminar porque asi me da error en lo que estoy haciendo.

lmpadron
01-10-2012, 15:25:35
Saludos a todos
Necesito convertir un String 'o UnicodeString a un char *

char * a = "Ejemplo"; // El resultado de esto es: "Ejemplo";
String a = "Ejemplo"; // El resultado de esto es: L"Ejemplo";

Como ven la (L) esta delante de lo que me da como resultado,cosa que quisiera eliminar porque asi me da error en lo que estoy haciendo.

Saludos

Revisa este link puede que te sirva (http://www.clubdelphi.com/foros/showthread.php?p=380695&langid=1)

escafandra
01-10-2012, 18:45:07
Saludos a todos
Necesito convertir un String 'o UnicodeString a un char *

char * a = "Ejemplo"; // El resultado de esto es: "Ejemplo";
String a = "Ejemplo"; // El resultado de esto es: L"Ejemplo";

Como ven la (L) esta delante de lo que me da como resultado,cosa que quisiera eliminar porque asi me da error en lo que estoy haciendo.

La "L" es una notación, no aparece en la cadena.
1.- Si tienes activada en las opciones del proyecto: _TCHAR maps to = char entonces y partiendo un un String Unicode, la función t_str() te devuelve una cadena tipo char*.
2.- Si tienes activada en las opciones del proyecto: _TCHAR maps to = wchar_t entonces y partiendo un un String Unicode, la función t_str() te devuelve una cadena tipo wchar_t*.
3.- c_str() siempre devuelve un wchar_t si se aplica a un UnicodeString.
4.- Siempre puedes forzar la conversión a AnsiString y aplicar c_str():
char *c = AnsiString(L"HOLA").c_str();


Saludos.

LuisMiguel
01-10-2012, 22:12:36
Gracias amigos por contestar
Estuve probando las variantes que me dieron pero aun sigue mi el problema
Voy a explicar mejor lo que quiero lograr,quizas este cometiendo algun error,
En la exportacion de un excel quiero dar la opcion de que se escoja la carpeta donde se va a guardar ese excel,para ello obtengo la direccion de un DirectoryListBox1 y lo paso a un Edit,en otro Edit doy la opcion para ponerle el nombre al excel

String Direccion = Edit1->Text;
String Nombre = Edit2->Text;
String Barras = "\\";
String Salvar = Direccion + Barras+ Nombre + ".xlsx";
char *c = AnsiString (Salvar).c_str();cuando trato de salvarlo en esta linea me da error:no se puede tener acceso al archivo,intente lo siguiente: ....... y pone unas cuantas cosas.
Excel.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", c);Si le pongo la direccion donde quiero salvar el excel directamente funciona perfectamente
Excel.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs","D:\\prueba.xlsx");En si lo que quisiera lograr es que : c tuviera ese valor("D:\\prueba.xlsx")
Gracias por su tiempo!!

ecfisa
01-10-2012, 22:20:27
En si lo que quisiera lograr es que : c tuviera ese valor("D:\\prueba.xlsx")
Hola.

Entonces creo que podrías simplemente hacer:

String Salvar = Edit1->Text + "\\\\" + Edit2->Text + ".xlsx";
char *c = Salvar.c_str();
...


Saludos.

Edito: Y se puede reducir el código un poco más:

char *c = AnsiString(Edit1->Text + "\\\\" + Edit2->Text + ".xlsx").c_str();
...

LuisMiguel
01-10-2012, 22:47:29
saludos ecfisa
Me sigue dando el mismo error:
Compruebe que la carpeta especificada existe. Compruebe que la carpeta que contiene el archivo no es de solo lectura. Compruebe que el archivo no contiene ninguno de los siguientes caracteres: < > ? [ ] : | o * Compruebe que el nombre del archivo o de la ruta no tienen mas de 218 caracteres.

Sin embargo como le decia cuando lo pongo directamente funcionaExcel.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs","D:\\prueba.xlsx");

ecfisa
01-10-2012, 22:59:30
Hola LuisMiguel.

Pero ese eror no proviene de la composición de la cadena, cuyo valor es fácilmente comprobable:

void __fastcall TForm1::Button1Click(TObject *Sender) {
TCaption a = "D:",
b = "\\\\",
c = "prueba",
d = ".xlsx";
ShowMessage(AnsiString(a+b+c+d).c_str());
}


Saludos.

LuisMiguel
01-10-2012, 23:16:08
Hice la siguiente prueba con lo que usted me dijo:

char *b = AnsiString(Edit1->Text + "\\\\" + Edit2->Text + ".xlsx").c_str();// resultado D:\backups\\prueba.xlsx
char *c = "D:\\backups\\prueba.xlsx"; // resultado D:\backups\prueba.xlsx
ShowMessage(b);
ShowMessage(c);Como ve el resultado de las 2 cadenas son diferentes.
Quizas el detalle este en las \\\\ que tiene
char *b = AnsiString(Edit1->Text + "\\\\" + Edit2->Text + ".xlsx").c_str();

LuisMiguel
01-10-2012, 23:20:26
probe como me dijo y devuelve: Tipo de variable incorrecto

ecfisa
01-10-2012, 23:24:49
Hola LuisMiguel
.
Quizas el detalle este en las \\\\ que tiene

Si claro, de ese modo agrega "\\", eso interpreté cuando dijiste
lo que quisiera lograr es que : c tuviera ese valor("D:\\prueba.xlsx")

Te hago una consulta, ¿ Que valores tienen Edit1->Text y Edit2->Text exáctamente ? (no lo que muestra sino lo que le ingresas)

Saludos.

LuisMiguel
01-10-2012, 23:31:07
Lo que ingreso
Edit1 D:\backups
Edit2 prueba

ecfisa
01-10-2012, 23:50:14
Lo que ingreso
Edit1 D:\backups
Edit2 prueba


Hola.

Dado tu ingreso, si deseas como resultado: "D:\backups\Prueba.xlsx" podés hacer:

String s = Edit1->Text;

char *c = AnsiString(IncludeTrailingPathDelimiter(s)+
Edit2->Text+".xlsx").c_str();


Si deseas como resultado: "D:\\bakcups\\Prueba.xlsx":

AnsiString s = Edit1->Text;

s = s.SubString(0,s.Pos("\\")) + "\\" +
s.SubString(s.Pos("\\")+1,s.Length()) +
+ "\\\\" + Edit2->Text + ".xlsx";
char *c = AnsiString(s).c_str();


Saludos

LuisMiguel
02-10-2012, 01:03:52
Finalmente la solucion para exportarlo es con:
String s = Edit1->Text;
char *c = AnsiString(IncludeTrailingPathDelimiter(s)+
Edit2->Text+".xlsx").c_str();Muchismas gracias por su tiempo y por su ayuda.Funciona perfectamente!!!