Visual C++ 2015でC++1zで提案されているTerse range-based for loopsと、C++11のUnicodeリテラルが入ったので使ってみました。
#include <algorithm> #include <iomanip> #include <sstream> #include <string> namespace { std::string const unreserved_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"; inline bool is_reserved_chars(char c) { return std::find(unreserved_chars.begin(), unreserved_chars.end(), c) != unreserved_chars.end(); } } namespace nek { std::string uri_encode(std::string const& value) { std::ostringstream encoded; for (c : value) { if (is_reserved_chars(c)) { encoded << c; } else { encoded << "%" << std::hex << std::uppercase << static_cast<int>(static_cast<unsigned char>(c)); } } return encoded.str(); } } #include <iostream> int main() { std::cout << nek::uri_encode(u8"abcあ123") << std::endl; } /* 実行結果 abc%E3%81%82123 */