【发布时间】:2011-07-23 13:02:31
【问题描述】:
如何将 QString 转换为 LPCSTR ?
#ifdef UNICODE 已定义和未定义时如何处理?
非常感谢:)
【问题讨论】:
如何将 QString 转换为 LPCSTR ?
#ifdef UNICODE 已定义和未定义时如何处理?
非常感谢:)
【问题讨论】:
我猜:
QString str("ddddd");
LPCSTR lstr = str.toStdString().c_str();
【讨论】:
LPCSTR 始终定义为 char*。您将它与 LPCTSTR(注意 T)混淆了,它可以映射到 const char* 或 const wchar_t*,具体取决于是否定义了 UNICODE。
QString可以一直保存Unicode; LPCSTR 绝不是 Unicode。这意味着您必须考虑如何处理不适合的字符。这不是“使用哪种方法”的问题,而是设计问题。
很有可能在您的特定情况下,您绝对知道 QString 仅包含本地“ANSI”代码页(也称为 ACP)中的字符。在这种情况下,正确的函数是QString::toLocal8Bit ()。
或者,您可能知道QString 仅包含来自 Latin1 (ISO 8859-1) 的字符。在这种情况下,正确的函数是QString::toLatin1()。
您可以尝试拨打QString::toUtf8()。即使QString 包含所有Unicode 字符,这也将始终生成有效的字节数组。但是,从形式上讲,您不能将 LPCSTR 指向它:UTF-8 不是有效的 ACP 代码页。据推测,您希望此 LPCSTR 传递给您无法控制的另一个函数。该函数可能不会期望 UTF-8。如果它完全需要 Unicode,则需要 LPCWSTR。
【讨论】:
我从here 找到了以下解决方案,它对我来说完美无缺:
void fooSub(LPSTSTR X); // this is our function :-)
foo()
{
QString text;
if(sizeof(TCHAR) == 1)
fooSub((LPCSTR)text.toLocal8Bit().constData()); // here you have to check, how to convert, you could also use utf8(), ...
else
fooSub((LPCWSTR)text.utf16());
}
【讨论】:
LPCSTR == const char *
它不是unicode,那么
LPCSTR s = (const char *)qtString;
【讨论】:
typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;
LPCTSTR。