代码之家  ›  专栏  ›  技术社区  ›  Manjoor

从char*到wchar*的转换问题*

  •  -1
  • Manjoor  · 技术社区  · 15 年前

    下线工作。它打印成功。

    wchar_t * s1 = (wchar_t *) L"INSERT INTO OE(sqltext) VALUES('this text')";
    
    if(WriteToSQL(s1) == 0)
      printf( "Success");     //Success
    else
      printf( "Failed");     
    

    我需要接受用户输入来创建动态SQL。我要做什么 L前缀正在执行。

    当我接受输入并进行所需的转换时,它不起作用。

    char input[100]; 
    char sql[500];  
    
    printf("Enter input string :: "); 
    fgets(input,100,stdin); 
    for(int i=0;i<100;i++) 
        if(input[i]==10) 
            input[i]=0; 
    
    strcpy(sql,"INSERT INTO OE(sqltext) VALUES('"); 
    strcat(sql,input); 
    strcat(sql,"')"); 
    
    wchar_t wsql[500];  
    MultiByteToWideChar( CP_UTF8, 0, sql, strlen(sql), 
    wsql, strlen(sql) + 1 );  
    
    
    if(WriteToSQL(wsql) == 0)
      printf( "Success");     
    else
      printf( "Failed");     // It failed
    

    长时间的交谈,但最终还是成功了。十六进制内存转储和来自USTA的输入是最有用的。感谢大家抽出时间来。

    3 回复  |  直到 15 年前
        1
  •  2
  •   usta    15 年前

    你不能只投一个 char * 到 wchar_t * 希望它能起作用。您必须进行适当的转换,例如使用 MultiByteToWideChar 功能。

    一般来说,对类型转换非常小心,特别是避免在C++程序中使用C样式的转换。这个例子很好地说明了为什么:你让编译器闭嘴( (SQLWCHAR *) sql ,作为回报,在运行时遇到了问题。只有当您确信自己做的是正确的事情,并且比编译器更了解时,才使用强制转换。不足为奇,这样的病例相对较少……

        2
  •  1
  •   Enni74    15 年前

    为什么不全程使用宽字符? 这样地:

    wchar_t input[100]; 
    wchar_t sql[500];  
    
    wprintf(L"Enter input string :: "); 
    fgetws(input,100,stdin); 
    for(int i=0;i<100;i++) 
        if(input[i]==10) 
            input[i]=0; 
    
    wcscpy(sql,L"INSERT INTO OE(sqltext) VALUES('"); 
    wcscat(sql,input); 
    wcscat(sql,L"')"); 
    
    
    if(WriteToSQL(sql) == 0)
      printf( "Success");     
    else
      printf( "Failed");     // It failed
    

    警告:我没有测试它,但它应该可以工作。

        3
  •  0
  •   Bojan Komazec    15 年前

    manjoor,通过使用tmain,您选择使用通用文本,因此要保持一致,并尝试在整个程序中使用通用文本类型。这样,您的代码将更干净,您就不需要使用讨厌的字符串转换,如multibytoWideChar。如果您可以更改WriteToSQL函数签名,请将参数“s”作为sqltchar*类型传递。将SQL和输入变量声明为TChar数组,使用tchar.h中的字符串例程(例如,_t printf而不是printf,_t()宏用于硬编码字符串…)。对于您正在使用的每个例程,请转到其msdn页并检查通用文本例程映射,以查看应该使用哪一个。

    谷歌支持微软的Unicode,以便更好地理解您在示例中提供的问题。