2010-12-01 22 views
0

Donc j'ai un fichier - fichier html il y a beaucoup de simbols comme &'""""</\>9()[email protected]#+=- Je dois les convertir en une forme qui peut être copiée à partir de l'écran de sortie afin d'être passé à std::string str ("Here should be UTF simbols"); comment faire une telle chose (en utilisant C++ boost)Comment lire à partir du fichier les simbols UTF comme s'il s'agissait d'un code UTF?

+0

Pouvez-vous s'il vous plaît préciser? Parlez-vous d'échapper des caractères HTML spéciaux, ou simplement de travailler avec Unicode correctement? –

+0

point est d'échapper tous les caractères dans le fichier et les sortir comme utf. Cela peut être copié et collé dans une chaîne (dans un autre fichier source C++). – Rella

+3

Tous ces caractères sont ASCII et ASCII est un sous-ensemble de UTF-8. – MSalters

Répondre

1

Ce code suppose que le système de compilation utilise un surensemble d'ASCII, ce qui est raisonnable sur les systèmes actuels. Il donne une chaîne littérale en tant que chaîne std ::, y compris les guillemets environnants. Les données d'entrée sont traitées comme des octets génériques plutôt que comme 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(); 
} 

Exemple:

// 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; 
} 

Sortie:

#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

ressemble grille, mais ce qu'il fera à quelque chose comme '? – Rella

+0

@Kabumbus: Je ne suis pas. J'ai déduit que vous voulez sortir un code source valide des données que vous avez déjà, et string_literal prend des données de chaîne et vous donne un littéral de chaîne valide. –