Как преобразовать шестнадцатеричное представление из URL (%) в std :: string (китайский текст)? - PullRequest
0 голосов
/ 17 октября 2019

Intro

У меня есть некоторые данные, которые мне нужно преобразовать в правильные китайские иероглифы, но я думаю, что застрял на последнем преобразовании числа в строку. Я проверил, используя этот онлайн-инструмент для преобразования шестнадцатеричного текста в , что e6b9af соответствует тексту .

MWE

Вот минимальный пример, который я сделалчтобы проиллюстрировать проблему. Входные данные "%e6%b9%af" (получены из URL-адреса где-то еще).

#include <iostream>
#include <string>

std::string attempt(std::string path)
{
  std::size_t i = path.find("%");
  while (i != std::string::npos)
  {
    std::string sub = path.substr(i, 9);
    sub.erase(i + 6, 1);
    sub.erase(i + 3, 1);
    sub.erase(i, 1);
    std::size_t s = std::stoul(sub, nullptr, 16);
    path.replace(i, 9, std::to_string(s));
    i = path.find("%");
  }
  return path;
}

int main()
{
  std::string input = "%E6%B9%AF";
  std::string goal = "湯";

  // convert input to goal
  input = attempt(input);

  std::cout << goal << " and " << input << (input == goal ? " are the same" : " are not the same") << std::endl;

  return 0;
}

Выходные данные

湯 and 15120815 are not the same

Ожидаемый вывод

湯 and 湯 are the same

Дополнительный вопрос

Все ли символы на иностранных языках представлены 3 байтами или это только для китайского языка? Поскольку моя попытка предполагает блоки по 3 байта, это хорошее предположение?

1 Ответ

0 голосов
/ 17 октября 2019

На основании ваших предложений и изменения примера с этот другой пост . Вот что я придумал.

#include <iostream>
#include <string>
#include <sstream>

std::string decode_url(const std::string& path)
{
  std::stringstream decoded;
  for (std::size_t i = 0; i < path.size(); i++)
  {
    if (path[i] != '%')
    {
      if (path[i] == '+')
        decoded << ' ';
      else
        decoded << path[i];
    }
    else
    {
      unsigned int j;
      sscanf(path.substr(i + 1, 2).c_str(), "%x", &j);
      decoded << static_cast<char>(j);
      i += 2;
    }
  }
  return decoded.str();
}

int main()
{
  std::string input = "%E6%B9%AF";
  std::string goal = "湯";

  // convert input to goal
  input = decode_url(input);

  std::cout << goal << " and " << input << (input == goal ? " are the same" : " are not the same") << std::endl;

  return 0;
}

Вывод

湯 and 湯 are the same

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...