短版我正在使用unicode。我试图将std :: string用于需要const WCHAR 字符串的函数; DrawString(const WCHAR ,...
我用GCC编译。一切都是unicode,我指定了。
我一直在尝试将字符串转换为wchar_t *。目的是让我可以使用GDI +函数输出,其参数需要它。
这是我如何输出字符串文字,没有问题,调试很好,工作正常。 http://msdn.microsoft.com/en-us/library/ms535991%28v=vs.85%29.aspx以供参考:
// works fine
wchar_t* wcBuff;
wcBuff = (wchar_t*)L"Some text here.\0";
AddString(wcBuff, wcslen(wcBuff), &gFontFamilyInfo, FontStyleBold, 20, ptOrg_Controls, &strFormat_Info);
现在这就是我一直在努力的,一整天,以及旁注:我的转换功能正常,不是问题,也不是创建。
// problems
string s = "Level " + convert::intToString(6) + "\0";
// try 1 - Segfault
wchar_t* wcBuff = new wchar_t[s.length() + 1];
copy(s.begin(), s.end(), wcBuff);
// random tries, compiles, but access violations (my conversion function here has worked other places, do not know for sure here.
wchar_t* wcBuff;
wstring wstr = convert::stringToWideChar(s);
wstring strvalue = convert::stringToWideChar(s);
wcBuff = (wchar_t*)strvalue.c_str();
wcBuff = (wchar_t*)wstr.c_str();
wstring foo;
foo.assign(s.begin(), s.end());
wcBuff = (wchar_t*)foo.c_str();
一切都在编译,但随后会出现问题。一旦达到该点,就会出现一些运行时错误。其他人访问违规和段错误。有些编译和调试没有问题,但字符串输出随着随机字符不断变化。
有什么想法吗?
答案 0 :(得分:0)
#include <string>
int main() {
// Can use convenient wstring
std::wstring wstr = L"My wide string";
// When you need a whar_t* just do this
const wchar_t* s = wstr.c_str();
// unicode form of strcpy
wchar_t buf[100] = {0};
wcscpy (buf,s);
// And if you want to convert from string to wstring
std::string thin = "I only take up one byte per character!";
std::wstring wide(thin.begin(), thin.end());
return 0;
}
答案 1 :(得分:0)
(这不是一个真正的答案,但它对评论来说太大了)
尝试1:你没有终止字符串
尝试2:无法看到转换功能,无法发表评论。删除演员。
尝试3:删除演员表,应该没问题。
在所有情况下都使用wchar_t const *wcBuff
。如果&#34;尝试3&#34;失败然后它意味着你的代码中的其他地方有一个错误,就在这里出现。尝试生成MCVE。您应该可以将其降低到大约10-20行。
即使您设法为您的意图编写正确的代码,这也是一种相当天真的转换,因为它不能正确处理0-127范围之外的字符。您需要考虑这是否是您想要的,或者您是否想要进行UTF-8转换等。
在Windows中,您可以使用MultiByteToWideChar。
答案 2 :(得分:0)
我首先将数据放入wstring。像这样:
(从字符串转换):
std::string sString = "This is my string text";
std::wstring str1(sString.begin(), sString.end());
(从int转换):
wstring str1 = std::to_wstring(BirthDate);
然后,我在GDI +命令中像这样使用它:
graphics.DrawString(str1.c_str(), -1,
&font, PointF(10, 5), &st);
答案 3 :(得分:-1)
首先是第一件事。 GDI+
是一个C ++库。它使用Microsoft C ++ ABI。 Microsoft C ++ ABI与gcc
完全不兼容,因此您可能会忘记使用它。您可以尝试使用WinAPI或任何其他使用C调用约定的库。
现在提出wstring
个问题。 wchar_t
在gcc中是32位宽,但Windows API要求它为16位宽。您不能使用任何需要wchar_t
的本机Windows调用。
您可以在-fshort-wchar
中使用gcc
命令行选项,这将使wchar_t
16位宽,您将重新获得与Windows API的兼容性,但会失去与libc
的兼容性,所以没有为你wchar_t
行事的图书馆功能。 std::wstring
可能只能使用标题,但wprintf
或wscpy
或其他所有已编译的内容都不会。
在编译时没有检测到这一点,因为gcc
看到的唯一内容是头文件。它无法判断相应的库是使用16位wchar_t
还是32位wchar_t
编译的。
当您需要将uint16_t
数组传递给Windows函数时,可以使用wchar_t
。如果您可以使用C ++ 11,那么它也可以使用char16_t
。这是一个应该与Basic Multilingual Plane字符一起使用的例子:
std::wstring myLittleNiceWstring;
...
std::vector<uint16_t> myUglyCompatibilityString;
std::copy(myLittleNiceWstring.begin(),
myLittleNiceWstring.end(),
std::back_inserter(myUglyCompatibilityString));
myUglyCompatibilityString.push_back(0);
UglyWindowsAPI(static_cast<WCHAR*>(myUglyCompatibilityString.data());
如果您有非BMP字符,则需要将UTF32转换为UTF16,而不是仅使用std :: copy复制字符。您可以使用libiconv
或自己编写转换例程(这很简单)或者只是从互联网上提供一些代码。
我认为,由于这个问题和其他问题,以GCC为中心的Windows开发相当困难。只要您坚持使用POSIX-ish API,就可以使用gcc。