C++と色々

主にC++やプログラムに関する記事を投稿します。

VC++2015PRでURIエンコード

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
*/