有关WinAPI unicode的教程?

时间:2009-08-13 00:05:31

标签: c++ winapi unicode

我想知道你们是否知道某种文章显示如何使代码完全unicode?我问的原因是因为我现在正在处理winapi,似乎所有的东西都应该像L“blabla”那样是unicode。我遇到的函数只能通过简单地使用标准字符串来正常工作。

谢谢!

3 个答案:

答案 0 :(得分:3)

当我的一个项目需要使用UNICODE打开和关闭时,我通常使用以下定义来创建一个使用TCHAR而不是CHAR和Wchar_t的STL字符串:

#ifdef _UNICODE
    typedef std::wstring tstring;
#else
    typedef std::string tstring;
#endif

或以下内容也可能有效:

typedef std::basic_string<TCHAR> tstring;

在我的整个项目中,我将所有字符串定义为tstring并使用_T()宏正确创建字符串。

当您调用WIN32 API时,只需对字符串使用.c_str()方法。

答案 1 :(得分:0)

关于你的最后一个陈述,如果你在谈论std :: string而是使用std :: wstring。

Toto已经回答了关键问题:只需在通常使用L"",char和string的地方使用"",WCHAR / wchar_t和wstring。

如果你发现自己需要在unicode和ansi之间进行转换,那就是龙。非常邪恶的龙,如果你不懂代码页,UTF8等,会让你活着。但对于大多数类型的应用程序,这是2%的情况,如果是这样的话。只要你保持全部unicode,其余的都很容易。

答案 2 :(得分:0)

用于Windows应用程序的Unicode可以通过一些简单的规则进行总结:

  • 在Visual Studio的项目设置中选择Unicode(仅供参考:在Windows上,Unicode始终为UTF16)。
  • 获取UTF8到UTF16和UTF16到UTF8功能。 (你可以自己写,或者在互联网上找到它。我个人使用Poco C ++库中的那些。)
  • 在您的代码中,始终使用std :: string作为类和函数接口。
  • 当您需要使用带有字符串参数的WinAPI调用时,您可以使用转换函数来填充本地std :: wstring,您可以在其上调用c_str()方法以传递给API函数。
  • 如果需要从WinAPI函数获取文本数据,那么通常需要在堆栈上创建本地TCHAR数组,将其传递给函数,从结果中构造一个std :: wstring,然后将其转换回使用UTF16到UTF8转换函数的std :: string。

示例:

使用堆叠分配的数组获取文本

std::string getCurrentDirectory()
{
    TCHAR buffer[MAX_PATH];
    ::GetCurrentDirectory(sizeof(buffer)/sizeof(TCHAR), &buffer[0]);
    return std::string(ToUTF8(buffer));
}

使用动态分配的缓冲区获取文本

std::string getWindowText(HWND inHandle)
{
            std::string result;
            int length = ::GetWindowTextLength(inHandle);
            if (length > 0)
            {
                    TCHAR * buffer = new TCHAR[length+1];
                    ::GetWindowText(inHandle, buffer, length+1);
                    result = ToUTF8(buffer);
                    delete [] buffer;
            }
            return result;
}

设置文字

void setWindowText(HWND inHandle, const std::string & inText)
{
    std::wstring utf16String = ToUTF16(inText);
    if (0 == ::SetWindowText(inHandle, utf16String.c_str()))
    {
        ReportError("Setting the text on component failed. Last error: " + getLastError(::GetLastError()));
    }
}

希望这有帮助。