我想知道你们是否知道某种文章显示如何使代码完全unicode?我问的原因是因为我现在正在处理winapi,似乎所有的东西都应该像L“blabla”那样是unicode。我遇到的函数只能通过简单地使用标准字符串来正常工作。
谢谢!
答案 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可以通过一些简单的规则进行总结:
示例:
使用堆叠分配的数组获取文本
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()));
}
}
希望这有帮助。