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

标签 c++ linux string urlencode wstring

所以我们have这样的功能:

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;
     }

它适用于 Windows,但我想知道如何(以及是否可能)使其在 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;
}

关于c++ - 如何让我的 `std::string url_encode_wstring(const std::wstring &input)` 在 Linux 上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7210389/

相关文章:

c++ - SFML 鼠标 getPosition 无法正常工作

c++ - 如何计算或查看编译时生成的指令数?

c - 寻找一种在 C 中访问 C++ 对象的方法,就像我在 C++ 中一样

linux - 无法使用 CYGWIN 获取已安装文件夹的磁盘使用情况

c++ - C++ 函数系统(命令)的输出在 Linux 终端中不显示颜色

c++ - VC++2010 自动生成方法 stub 或原型(prototype)

c++ - 如何在 QtCreator (Linux Ubuntu) 中编译和运行一个随机的单个 C++ 文件?

r - 在空白处分割字符串向量

c++ - 棘手的方法 - 需要解决方案

将字符串复制到链接列表不起作用