2009-12-17 92 views
2

我有一种情况,我需要将char*WideString进行比较。
如何将WideString转换为C++中的char *?如何将System :: WideString转换为char *,反之亦然?

+1

你有没有想过呢? (将char *转换为WideString) – 2009-12-17 23:57:30

+0

好吧,两种方法都很好理解。不过,我宁愿不使用WideString。 – Seth 2009-12-18 00:01:39

+0

也许你可以延伸'char'类型,直到它足够宽? ;-) 由于'char'类型小于* WideString *所使用的类型,因此更好的方法是将较小的值转换为较大的值然后进行比较。 – 2009-12-18 00:33:42

回答

3
+0

该解决方案仅限于Windows。 – 2009-12-18 00:15:09

+0

是的,C99 wcstombs()/ mbstowcs()在其他答案中已有介绍。 – Gonzalo 2009-12-18 00:18:22

+0

比利,这是System :: WideString类型,这是这个问题的主题。 – 2009-12-18 02:48:15

1

不可能。其实,你混合了两个不同的概念:

  • Widestring意味着UTF-16编码的缓冲区。
  • char *可能包含任何内容,从UTF-8到纯ASCII文本(在这种情况下,只有在您的宽字符串不包含非ASCII字符时才可以转换)。

请参阅我有关如何正确处理文本的https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful的回答。

+0

wchar_t被定义为仅在Windows上包含UTF-16编码数据。对于其他操作系统可能会有所不同。一般来说,它是依赖于区域的。 – mch 2009-12-18 01:49:58

+0

我有一个提供WideString的第三方组件。但是,我需要将它与std :: string进行比较,如果不可能有什么选项? – Seth 2009-12-18 01:49:59

+0

转换其他方式,然后比较。 – 2009-12-18 03:39:34

1

比较一个System::WideString对象与char*(因为这个问题说你想做的事),你可以创建从指针新WideString对象,然后使用普通==操作。该课程有几个构造函数,其中一个用于const char*

char* foo = ...; 
WideString bar = ...; 
if (WideString(foo) == bar) 
    std::cout << "They're equal!\n"; 

其实,只要WideString对象是在左边,你甚至不需要构造函数调用,因为指针会自动转换。

if (bar == foo) { ... } 

转换一个WideStringchar*(因为这个问题标题说你想做的事),你可能会考虑使用AnsiString类型。它们可以相互转换。要获得普通指针,请拨打c_str方法,就像使用std::string一样。

WideString bar = ...; 
AnsiString foo = bar; 
std::cout << foo.c_str(); 
+0

A *空格*?这是不对的。空字符会导致截断;如果有一个不在字符串的实际末尾,那么使用构造函数的双参数版本,以便可以指定实际长度。如果你在'std :: istringstream'中有某个东西,并且正在用'stream >> stringvar'从它读取一个字符串,那么空格可能会导致截断。 – 2009-12-18 03:54:09

相关问题