【问题标题】:Converting Unicodestring to Char[]将 Unicodestring 转换为 Char[]
【发布时间】:2012-08-30 14:58:17
【问题描述】:

我有一个包含四个单词行的列表框的表单。 当我点击一行时,这些词应该会出现在四个不同的文本框中。 到目前为止,我已经完成了所有工作,但是我在字符转换方面遇到了问题。

列表框中的字符串是 UnicodeString,但 strtok 使用 char[]。 编译器告诉我“无法将 UnicodeString 转换为 Char[]”。这是我为此使用的代码:

{
 int a;
 UnicodeString b;

 char * pch;
 int c;

 a=DatabaseList->ItemIndex;   //databaselist is the listbox
 b=DatabaseList->Items->Strings[a]; 

 char str[] = b; //This is the part that fails, telling its unicode and not char[].
 pch = strtok (str," ");      
 c=1;                          
 while (pch!=NULL)
    {
       if (c==1)
       {
          ServerAddress->Text=pch;
       } else if (c==2)
       {
          DatabaseName->Text=pch;
       } else if (c==3)
       {
          Username->Text=pch;
       } else if (c==4)
       {
          Password->Text=pch;
       }
       pch = strtok (NULL, " ");
       c=c+1;
    }
}

我知道我的代码看起来不太好,实际上很糟糕。我只是在学习一些 C++ 编程。

如何转换?

【问题讨论】:

  • 请以ICU库u_strToUTF8为例
  • 你能解释一下为什么这应该是必要的吗?应该怎么做?

标签: char c++builder


【解决方案1】:

strtok 实际上会修改您的 char 数组,因此您需要构造一个允许修改的字符数组。直接引用 UnicodeString 字符串将不起作用。

// first convert to AnsiString instead of Unicode.
AnsiString ansiB(b);  

// allocate enough memory for your char array (and the null terminator)
char* str = new char[ansiB.Length()+1];  

// copy the contents of the AnsiString into your char array 
strcpy(str, ansiB.c_str());  

// the rest of your code goes here

// remember to delete your char array when done
delete[] str;  

【讨论】:

  • 非常感谢!!我要去看看它是如何工作的,你做了什么,但它奏效了!
  • 我最近编辑了我的帖子以制作长度为 ansiB.Length()+1 的 char 数组。这个很重要。确保您进行了更改,否则您可能会遇到随机崩溃。
  • 关闭程序后确实出现错误。当我使用您提供的代码时,我遇到访问冲突,当我中断它时会跳转到 Forms.hpp /* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { } 这是否意味着出现问题str 还是什么?
  • 哈哈太好了,没及时赶上你。它就像一个魅力!感谢您的支持!!!
  • 不客气,欢迎来到 Stack Overflow。记得接受一个正确的答案。
【解决方案2】:

这对我有用,并且可以节省我转换为 AnsiString 的时间

// Using a static buffer
#define MAX_SIZE 256
UnicodeString ustring = "Convert me";
char mbstring[MAX_SIZE];

    wcstombs(mbstring,ustring.c_str(),MAX_SIZE);

// Using dynamic buffer
char *dmbstring;

    dmbstring = new char[ustring.Length() + 1];
    wcstombs(dmbstring,ustring.c_str(),ustring.Length() + 1);
    // use dmbstring
    delete dmbstring;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 2011-05-31
    • 2021-04-29
    相关资源
    最近更新 更多