2010-12-01 10 views
0

私はファイルhtmlファイルを持っているので、&'""""</\>9()[email protected]#+=-のようなsimbolsがたくさんあります。出力スクリーンからコピーできるフォームに変換する必要があります。std::string str ("Here should be UTF simbols");に渡された後にする方法(C++ boostを使用)ファイルUTF simbolsをUTFコードと同じように読み込む方法は?

+0

あなたは明確にしてくださいことはできますか?特別なHTML文字をエスケープすることについて話しているのですか、あるいは正しくUnicodeで作業していますか? –

+0

ポイントはファイル内のすべての文字をエスケープしてutfとして出力します。文字列にコピーして貼り付けることができます(他のC++ソースファイルでは)。 – Rella

+3

これらの文字はすべてプレーンASCIIで、ASCIIはUTF-8のサブセットです。 – MSalters

答えて

1

このコードでは、コンパイルシステムがASCIIのスーパーセットを使用していることを前提としています。これは、囲み引用符を含むstd :: stringとして文字列リテラルを与えます。入力データは、UTF-8である必要はなく汎用バイトとして扱われます。

std::string string_literal(int length, char const *data) { 
    std::stringstream s; 
    std::ostream shex (s.rdbuf()); 
    shex << std::hex << std::uppercase; 
    shex.fill('0'); 

    s << '"'; 
    for (int n = 0; n != length; ++n) { 
    unsigned char c = data[n]; 
    if (c < 32 || 0x7F <= c) { 
     // add special cases for \n, \t, \r, etc. to produce nicer output 
     shex << "\\x" << std::setw(2) << int(c); 
    } 
    else { 
     switch (c) { 
     case '"': 
     case '\\': 
     s << '\\' << c; 
     break; 

     default: 
     s << c; 
     } 
    } 
    } 
    s << '"'; 
    return s.str(); 
} 

例:

// for string literals, makes below example easier 
template<int N> 
std::string string_literal(char const (&data)[N]) { 
    assert(data[N - 1] == '\0'); 
    return string_literal(N - 1, data); 
} 

// another convenience overload 
std::string string_literal(std::string const &s) { 
    return string_literal(s.length(), s.data()); 
} 

int main() { 
    std::cout << "#include <iostream>\nint main() {\n std::cout << "; 
    std::cout << string_literal("&'\"</\\>9()[email protected]#+=-") << "\n   << "; 
    std::cout << string_literal("☺ ☃ ٩(•̮̮̃•̃)۶") << ";\n}\n"; 
    // first and second are a smiley face and snowman 
    // the third may not display correctly on your browser 
    return 0; 
} 

出力:

#include <iostream> 
int main() { 
    std::cout << "&'\"</\\>9()[email protected]#+=-" 
      << "\xE2\x98\xBA \xE2\x98\x83 \xD9\xA9(\xE2\x80\xA2\xCC\xAE\xCC\xAE\xCC\x83\xE2\x80\xA2\xCC\x83)\xDB\xB6"; 
} 
+0

は怒っているようですが、「 Rella

+0

@Kabumbus:私は従いません。私はあなたが既に持っているデータから有効なソースコードを出力したいと推測しました。そしてstring_literalはいくつかの文字列データを取り、あなたに有効な文字列リテラルを与えます。 –

関連する問題