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?
Répondre
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";
}
ressemble grille, mais ce qu'il fera à quelque chose comme '? – Rella
@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. –
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? –
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
Tous ces caractères sont ASCII et ASCII est un sous-ensemble de UTF-8. – MSalters