将Unicode字符串转换为字符数组

8

我有一个带有列表框的表单,其中包含四个单词的行。当我点击某一行时,这些单词应该在四个不同的文本框中显示出来。 到目前为止,我已经让所有东西都运作良好,但我在字符转换方面遇到了问题。

列表框中的字符串是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 函数,例如: - harsha
你能解释为什么这是必要的,以及应该如何实现吗? - Nico Haase
2个回答

8

strtok实际上会修改你的字符数组,因此你需要构造一个允许你修改的字符数组。直接引用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;  

非常感谢!我将找出你所做的是如何工作的,但它成功了! - Stefan Oostwegel
我最近编辑了我的帖子,将字符数组的长度设置为 ansiB.Length()+1。这很重要,请确保您进行了更改,否则可能会导致随机崩溃。 - Jeff Wilhite
关闭程序后,我确实遇到了一个错误。当我使用您提供的代码时,我遇到了访问冲突错误,当我中断时,它跳转到Forms.hpp /* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { } 这可能意味着str或其他某些东西出了问题吗? - Stefan Oostwegel
哈哈太好了,我来晚了。它像魔法一样工作!谢谢你的支持!!! - Stefan Oostwegel
欢迎您来到Stack Overflow,不用客气。请记得接受一个答案作为正确的答案。 - Jeff Wilhite
дҪҝз”Ёstd::stringжҲ–std::vector<char>д»Јжӣҝnew+strcpyеҸҜд»ҘдҪҝжӮЁзҡ„д»Јз Ғжӣҙжҳ“дәҺз»ҙжҠӨпјҢ并еңЁејӮеёёжғ…еҶөдёӢжӣҙеҠ е®үе…ЁгҖӮ - M.M

0

这对我很有效,而且节省了我转换为 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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接