До C ++ 11 в стандарте не было обязательной поддержки UTF-8.
Здесь есть два шага:
- конвертировать в UTF-8 (если он уже не в UTF-8)
- URL-экранирование результата (обновление: Джеймс Канзе освещает эту часть)
Ни один из них не является особенно трудным для написания для себя портативно, если вы знаете, какой кодировкой символов используется входная строка [*]. Это означает, что другие люди делали это раньше, вам не нужно писать это самостоятельно. Если вы будете искать их отдельно, вам, возможно, повезет с поиском независимого от платформы кода для каждого шага.
Обратите внимание, что есть два разных способа URL-экранирования пробела: либо +
, либо %20
. В вашем примере используется %20
, поэтому, если это важно для вас, не используйте случайно подпрограмму экранирования URL, которая делает другое.
[*]
Это не ISO-Latin-1, поскольку на нем нет знака евро [**], но это может быть Windows CP-1252.
[**]
Если это не было добавлено недавно. В любом случае, ваш пример кодирует знак евро в виде байтов UTF-8 0xE2 0x82 0xAC
, которые представляют кодовую точку Unicode 0x20AC
, а не кодовую точку 0x80
, которую он имеет в CP1252. Таким образом, если изначально это была однобайтовая кодировка, то очевидно, что интеллектуальное преобразование однобайтовой кодировки в кодировку юникода было применено на этом пути. Можно сказать, что есть три шага:
- преобразовать
std::string
в кодовые точки Unicode (зависит от входной кодировки).
- конвертировать Unicode в UTF-8
- URL-экранирование UTF-8