2

在 .net 中,我们Uri.EscapeDataString对 unicode 进行了编码。它将“Ää”转换为“%C3%84%C3%A4”。Uri.EscapeDataStringCLI中的等价物是什么。我的代码在 VC++ 中,我不想使用 Uri.EscapeDataString。我试过了WideCharToMultiByte(...)。但这不会返回相同的结果。我可以在 CLI 中使用什么 API 或任何其他方式可以在 CLI 中获得相同的结果?

4

1 回答 1

0

最后在同事的帮助下得到了答案。首先使用 WideCharToMultiByte(..) 将 Widechar 转换为 multibye。即将unicode转换为utf-8。然后我们必须逐字节将其编码为十六进制。

string methodTOHex()
{
  string s = "Ä";


  int len;
  int slength = (int)s.length() + 1;
  len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
  wchar_t* buf = new wchar_t[len];
  MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
  std::wstring temp(buf);
  delete[] buf;
  LPCWSTR input = temp.c_str();

  int cbNeeded = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL);
  if (cbNeeded > 0) {
    char *utf8 = new char[cbNeeded];
    if (WideCharToMultiByte(CP_UTF8, 0, input, -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 += onehex;
      }
    }
    delete[] utf8;
  }

  return output;
}
于 2013-03-13T06:58:30.947 回答