...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

std:string <> std:wstring

この間 std::string と std::wstringの相互変換関数が必要になって作ったので投下.
Windows 専用だけど,お好きにどうぞ.
もっとメジャーな実装がある,間違ってる,などあればよろしく.

// strconv.h
#pragma once

// このヘッダを使うときはアプリケーションの
// 最初にロケールの設定をすることを忘れずに!
//
// setlocale(LC_ALL, "Japanese");

#include <stdlib.h>
#include <string>

/// std::stringとstd::wstringの相互変換関数を定義した名前空間
namespace strconv
{

/// std::wstring -> std::string
inline std::string narrow(const std::wstring& input)
{
    char* buffer = new char[input.size() * MB_CUR_MAX + 1];
    ZeroMemory(buffer, sizeof(char) * (input.size() * MB_CUR_MAX + 1));
    wcstombs(buffer, input.c_str(), input.size() * MB_CUR_MAX);
    std::string result = buffer;
    delete[] buffer;
    return result;
}

/// std::string -> std::wstring
inline std::wstring widen(const std::string& input)
{
    wchar_t* buffer = new wchar_t[input.size() + 1];
    ZeroMemory(buffer, sizeof(wchar_t) * (input.size() + 1));
    mbstowcs(buffer, input.c_str(), input.size());
    std::wstring result = buffer;
    delete[] buffer;
    return result;
}

} // namespace strconv