CLX C++ Libraries - code_convert
Author: clown

CLX C++ Libraries
Home >> code_convert

# Declaration

    template <class Type, class CharT>
    std::basic_string<Type> code_convert(const std::basic_string<CharT>& src,
        cost std::codecvt<wchar_t, char, mbstate_t>& cvt);

    template <class Type, class CharT>
    std::basic_string<Type> code_convert(const std::basic_string<CharT>& src,
        const std::locale& loc = std::locale());

    template <class Type, class Source>
    std::basic_string<Type> code_convert(const Source* src,
        const std::codecvt<wchar_t, char, mbstate_t>& cvt);

    template <class Type, class Source>
    std::basic_string<Type> code_convert(const Source* src,
        const std::locale& loc = std::locale());

# Overview

code_convert は，ナロー文字 (char) <-> ワイド文字 (wchar_t) の相互変換を行うためのクラスです．std::basic_string<CharT> から std::basic_string<Type>，または Source* から std::basic_string<Type> への変換を試みます．実際の変換処理は，std::codecvt<wchar_t, char, mbstate_t> に依存します．

# Example

example_code_convert.cpp

    #ifndef CLX_USE_WCHAR
    #define CLX_USE_WCHAR
    #endif // CLX_USE_WCHAR

    #include <iostream>
    #include <string>
    #include "clx/code_convert.h"

    int main(int argc, char* argv[]) {
        try {
            std::cout.imbue(std::locale("japanese"));
            std::wcout.imbue(std::locale("japanese"));

            // char -> wchar_t
            std::string s = "はろーわーるど";
            std::wstring wcvt = clx::code_convert<wchar_t>(s, std::locale("japanese"));

            std::wcout << L"char -> wchar_t" << std::endl;
            std::wcout << L"-----" << std::endl;
            std::cout << "original: " << s << " (" << s.size() << ")" << std::endl;
            std::wcout << L"convert: " << wcvt << L" (" << wcvt.size() << L")"
                << std::endl;
            std::wcout << std::endl;

            // wchar_t -> char
            std::wstring ws = L"ハローワールド";
            std::string cvt = clx::code_convert<char>(ws, std::locale("japanese"));

            std::cout << "wchar_t -> char" << std::endl;
            std::cout << "-----" << std::endl;
            std::wcout << L"original: " << ws << L" (" << ws.size() << L")" << std::endl;
            std::cout << "convert: " << cvt << " (" << cvt.size() << ")" << std::endl;
        }
        catch (std::runtime_error& e) {
            std::cerr << e.what() << std::endl;
            std::exit(-1);
        }

        return 0;
    }

    Result
    char -> wchar_t
    -----
    original: はろーわーるど (14)
    convert: はろーわーるど (7)

    wchar_t -> char
    -----
    original: ハローワールド (7)
    convert: ハローワールド (14)

# Referrences

1. Life like a clown - ワイド文字と codecvt
2. ワイド文字列の罠