如何使我的`std :: string url_encode_wstring(const std :: wstring&input)`在Linux上工作?

所以我们有这样的function:

std::string url_encode_wstring(const std::wstring &input) { std::string output; int cbNeeded = WideCharToMultiByte(CP_UTF8, 0, input.c_str(), -1, NULL, 0, NULL, NULL); if (cbNeeded > 0) { char *utf8 = new char[cbNeeded]; if (WideCharToMultiByte(CP_UTF8, 0, input.c_str(), -1, utf8, cbNeeded, NULL, NULL) != 0) { for (char *p = utf8; *p; *p++) { char onehex[5]; _snprintf(onehex, sizeof(onehex), "%%%02.2X", (unsigned char)*p); output.append(onehex); } } delete[] utf8; } return output; } 

它的窗户篦,但我不知道如何(也有可能),使之在Linux下工作?

恕我直言,你应该使用一个便携式字符编解码器库。 这是一个使用iconv的最小可移植代码的示例,应该足够了。 它应该在Windows上工作(如果是这样,你可以完全摆脱你的Windows特定的代码)。 我遵循GNU指南,不使用wcstombs&co函数( https://www.gnu.org/s/hello/manual/libc/iconv-Examples.html )根据用例,适当地处理错误…并提高性能,你可以创建一个班级。

 #include <iostream> #include <iconv.h> #include <cerrno> #include <cstring> #include <stdexcept> std::string wstring_to_utf8_string(const std::wstring &input) { size_t in_size = input.length() * sizeof(wchar_t); char * in_buf = (char*)input.data(); size_t buf_size = input.length() * 6; // pessimistic: max UTF-8 char size char * buf = new char[buf_size]; memset(buf, 0, buf_size); char * out_buf(buf); size_t out_size(buf_size); iconv_t conv_desc = iconv_open("UTF-8", "wchar_t"); if (conv_desc == iconv_t(-1)) throw std::runtime_error(std::string("Could not open iconv: ") + strerror(errno)); size_t iconv_value = iconv(conv_desc, &in_buf, &in_size, &out_buf, &out_size); if (iconv_value == -1) throw std::runtime_error(std::string("When converting: ") + strerror(errno)); int ret = iconv_close(conv_desc); if (ret != 0) throw std::runtime_error(std::string("Could not close iconv: ") + strerror(errno)); std::string s(buf); delete [] buf; return s; } int main() { std::wstring in(L"hello world"); std::wcout << L"input: [" << in << L"]" << std::endl; std::string out(wstring_to_utf8_string(in)); std::cerr << "output: [" << out << "]" << std::endl; return 0; }