如何使 String 到 const wchar_t* 转换函数在 Windows 和 Linux 下工作

发布于 2024-08-14 00:23:25 字数 909 浏览 4 评论 0原文

我正在开发一个为 MSVCC / Windows 编写的项目,我必须将其移植到 GCC / Linux。该项目有自己的 String 类,它将其数据存储在 Qt 的 QString 中。对于转换为 wchar_t* 最初有这个方法(对于 Windows):

const wchar_t* String::c_str() const
{
    if (length() > 0)
    {
        return (const wchar_t*)QString::unicode();
    }
    else
    {
        return &s_nullString;
    }
}

因为 unicode() 返回一个 QChar(16 位长),所以这在 Windows 下工作,因为 wchar_t 是 16 位,但现在使用 GCC wchar_t 是 32 位长,所以这不再起作用了。我试图用这个来解决这个问题:

const wchar_t* String::c_str() const
{
    if ( isEmpty() )
    {
        return &s_nullString;
    }
    else
    {
        return toStdWString().c_str();
    }
}

这个问题是,当这个函数返回时,该对象不再存在,所以这也不起作用。 我认为解决这个问题的唯一方法是:

  1. 不要使用 String::c_str() 并直接调用 .toStdString().c_str()
  2. 让 GCC 将 wchar_t 视为 16 位类型

可能意味着几个小时的不必要的时间对我有用,我不知道可能性 2 是否可能。我的问题是,如何最好地解决这个问题? 我将不胜感激任何有用的建议。谢谢。

I work on a project written for MSVCC / Windows, that I have to port to GCC / Linux. The Project has its own String Class, which stores its Data in a QString from Qt. For conversion to wchar_t* there was originally this method (for Windows):

const wchar_t* String::c_str() const
{
    if (length() > 0)
    {
        return (const wchar_t*)QString::unicode();
    }
    else
    {
        return &s_nullString;
    }
}

Because unicode() returns a QChar (which is 16 Bit long), this worked under Windows as wchar_t is 16 Bit there, but now with GCC wchar_t is 32 Bit long, so that doesn't work anymore. I've tried to solve that using this:

const wchar_t* String::c_str() const
{
    if ( isEmpty() )
    {
        return &s_nullString;
    }
    else
    {
        return toStdWString().c_str();
    }
}

The problem with this is, that the object doesn't live anymore when this function returns, so this doesn't work eiter.
I think the only way to solve this issue is to either:

  1. Don't use String::c_str() and call .toStdString().c_str() directly
  2. Make GCC treat wchar_t as 16 bit type

Possibility one would mean several hours of needless work to me and I don't know if possiblity 2 is even possible. My question is, how do I solve this issue best?
I'd appreciate any useful suggestion. Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

水中月 2024-08-21 00:23:25

在我看来,有两种方法:

  1. 在需要时将 QString 转换为 wchar_t*
  2. 让 QString 存储 wchar_t* 并直接返回 QString::unicode

这两个函数可以将 QString 转换为 std::string 和 std::wstring
QString::toStdWString
QString::toStdString

将 QString 构建为 ucs4 :

#define QT_QSTRING_UCS_4
#include "qstring.h"

这可以在 qt3 中使用(qstring.h)。我找不到qt4的源码。

In my opinion, there are 2 ways :

  1. convert QString to wchar_t* when needed
  2. Let QString to store wchar_t* and return QString::unicode directly

These two functions can convert a QString to std::string and std::wstring
QString::toStdWString
QString::toStdString

To build QString as ucs4 :

#define QT_QSTRING_UCS_4
#include "qstring.h"

This can be used in qt3(qstring.h). I can't find the source of qt4.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文