2012-03-07 8 views
0

C/C++プログラムで文字列/ charを\ uxxx形式に変換したいと考えています。 サポート私は文字 'A'を持っています。\ u0041(標準のUnicode)として変換して印刷したいと思います。C/C++でchararcterを uxxx形式に変換する

2番目のことは、unixコマンドユーティリティを使用してprint(printf)を実行して、\ uxxx文字列をcharに印刷していたことです。私は "\ u092b"を試してみましたが、私のフォントファイルとは違う文字を印刷していました。誰でもこの背後にある理由を説明できますか?

+0

あなたは動作しませんでしたそれは何をしようとしたのですか? – geoffspear

+3

プログラム内の文字を表すために使用する内部形式は何ですか? ASCII/UTF-8/UTF-16/UTF-32/CP1490/ISO8859-1? \ u形式は4桁の16進数または6桁の数字しかサポートしません。それが4しかサポートしていない場合は、UTF-16(すべてのコードポイントを4桁の16進数で表すことができるように)でエンコードし、長い文字に対して代理ペアを使用する必要があります。 –

答えて

0

標準的なC++を使ってこれを行う関数です(CharTによるが、実装によっては定義された有効な動作が満たされないという要件がいくつかあるかもしれません)。

#include <codecvt> 
#include <sstream> 
#include <iomanip> 
#include <iostream> 

template<typename CharT,typename traits,typename allocator> 
std::basic_string<CharT,traits,allocator> 
to_uescapes(std::basic_string<CharT,traits,allocator> const &input) 
{ 
    // string converter from CharT to char. If CharT = char then no conversion is done. 
    // if CharT is char32_t or char16_t then the conversion is UTF-32/16 -> UTF-8. Not all implementations support this yet. 
    // if CharT is something else then this uses implementation defined encodings and will only work for us if the implementation uses UTF-8 as the narrow char encoding 
    std::wstring_convert<std::codecvt<CharT,char,std::mbstate_t>,CharT> convertA; 

    // string converter from UTF-8 -> UTF-32. Not all implementations support this yet 
    std::wstring_convert<std::codecvt<char32_t,char,std::mbstate_t>,char32_t> convertB; 

    // convert from input encoding to UTF-32 (Assuming convertA produces UTF-8 string) 
    std::u32string u32input = convertB.from_bytes(convertA.to_bytes(input)); 

    std::basic_stringstream<CharT,traits,allocator> ss; 
    ss.fill('0'); 
    ss << std::hex; 
    for(char32_t c : u32input) { 
     if(c < U'\U00010000') 
      ss << convertA.from_bytes("\\u") << std::setw(4) << (unsigned int)c; 
     else 
      ss << convertA.from_bytes("\\U") << std::setw(8) << (unsigned int)c; 
    } 
    return ss.str(); 
} 

template<typename CharT> 
std::basic_string<CharT> 
to_uescapes(CharT const *input) 
{ 
    return to_uescapes(std::basic_string<CharT>(input)); 
} 

int main() { 
    std::string s = to_uescapes(u8"Hello \U00010000"); 
    std::cout << s << '\n'; 
} 

この印刷する必要があります:

を\ u0048 \ u0065 \ u006c \ u006c \ u006f \ U0020 \ U00010000

+0

私はcodecvtヘッダファイルがないので、これをubuntuでコンパイルできません –

関連する問題