7
votes

Comment est-ce que je suis html- / url-encoder un STD :: wstring contenant des caractères unicode?

J'ai encore une autre question. Si j'avais une STD :: wstring ressemblant à ceci:

ドイツ で の サイト サイト サイト サイト サイト サイト サイト サイト サイトまし

Comment pourrais-je éventuellement l'obtenir d'être codé URL (% nn , n = 0-9, a-f) à:

% E3% 83% 89% E3% 82% A4% E3% 83% 84% E8% AA% 9E% E3% 81% A7% E6% A4% 9C% E7% B4% A2% E3% 81% 97% E3% 81% A6% E3% 81% 84% E3% 81% A6% E3% 81% 93% E3% 81% A1% E3% 82% 89% E3% 81% AE% E3% 82% B5% E3% 82% A4% E3% 83% 88% E3% 81% AB% E3% 81% 9f% E3% 81% A9% E3% 82% 8A% E7% 9D% 80% E3% 81% 8D% E3% 81%% E3% 81% 97% E3% 81% 9f% E3% 80% 82

... et aussi codé HTML ( & # nnn ( nn ) ;, n = 0-9 (?)) à:

ドイツ で の サイト サイト サイト サイト サイト サイト サイト サイト サイトまし

aidez-moi s'il vous plaît comme je suis totalement perdu en ce moment et ne sait même pas où commencer. Au fait, la performance n'est pas très importante pour moi en ce moment.

Merci d'avance!


3 commentaires

Avez-vous besoin d'une bibliothèque ou souhaitez-vous le coder vous-même? Vérifiez Cet article avec un échantillon.


Êtes-vous lié à un système d'exploitation spécifique ou si le programme serait indépendant de la plate-forme? L'encodage utilisé par std :: wstring varie entre les systèmes d'exploitation.


Kirill: Oh, je m'en fiche. Je pourrais essayer de le faire moi-même au lieu d'utiliser une bibliothèque éventuellement gonflée: / Philipp: Je n'ai pas besoin de cela pour être indépendant de la plate-forme. C'est bon si cela fonctionne sur Win32 seulement.


5 Réponses :


1
votes

Vous voyez, avant de pouvoir convertir un caractère en une séquence d'évacuation de l'URL, vous devez convertir votre wstring * en caractères-caractères iso-latin, ce qui est utilisé pour les URL. ICU pourrait être un bon endroit pour commencer, où vous pouvez transmettre votre wstring et obtenir un ISO -Le séquence de lutin. Ensuite, simplement itéraler à travers les caractères qui en résulte et les convertir à la Sciquence d'échappement: xxx

look ici pour plus d'informations sur la manière de formater la chaîne.

* Je suppose que votre wstring est un UTF-16, ce qui est généralement le cas, bien que Vous n'avez pas spécifié

Ce pourrait aide aussi.


4 commentaires

Merci de votre temps, mais l'exemple ne fonctionne pas bien avec Unicode pour moi (les résultats ressemblent à% n,% nn et même% nnn ainsi que% nnnn pour certains caractères) :(


@Oliver Sry, oublié de la largeur et de remplir les gars. J'ai inclus dans le code ci-dessus. Et comme je l'ai dit, vous devez convertir en Iso-latin avec l'ICU avant en utilisant le Sstream.


Vous ne pouvez pas convertir les caractères chinois en un codage latin. L'utilisation de UTF-8 est le choix commun.


@Phillip Bien sûr, il est probablement une erreur ou documentée à tort, mais les URL par défaut utilisent Iso-Lantin (qui est un sous-ensemble de UTF-8) au lieu de UTF-8. Cependant, en ignorant que l'UTF-8 pourrait toujours être en sécurité.



4
votes

Voici un exemple qui montre deux méthodes, une fois sur la bibliothèque QT et une base sur la bibliothèque ICU. Les deux devraient être assez indépendants: xxx


1 commentaires

Ne me trompe pas! J'apprécie votre contribution informative et votre temps! Mais cela a l'air trop gonflé pour mes besoins ...: /



0
votes

Voici une version qui convertit de l'UTF-16 (WRCHAR) en UTF-8 codé hex à l'aide de la fonction widechartomultibyte () Win32 spécifique ().

#include <string>
#include <iostream>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

std::string unhexlify(const std::string &input)
{
  std::string output;
  for (const char *p = input.c_str(); *p; ) {
    if (p[0] == '%' && isxdigit(p[1]) && isxdigit(p[2])) {
      int ch = (isdigit(p[1]) ? p[1] - '0' : toupper(p[1]) - 'A' + 10) * 16 + 
               (isdigit(p[2]) ? p[2] - '0' : toupper(p[2]) - 'A' + 10);
      output.push_back((char)ch);
      p += 3;
    } else if (p[0] == '%' && p[1] == '#' && isdigit(p[2])) {
      int ch = atoi(p + 2);
      output.push_back((char)ch);
      p += 2;
      while (*p && isdigit(*p)) p++;
      if (*p == ';') p++;
    } else {
      output.push_back(*p++);
    }
  }
  return output;
}


std::wstring utf8_hex_to_wstring(const std::string &input)
{
  std::wstring output;
  std::string utf8 = unhexlify(input);
  int cchNeeded = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0);
  if (cchNeeded > 0) {
    wchar_t *widebuf = new wchar_t[cchNeeded];
    if (MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, widebuf, cchNeeded) != 0) {
      output = widebuf;
    }
    delete[] widebuf;
  }
  return output;
}

int main(int, char*[])
{
  std::wstring ja = L"ドイツ語で検索していてこちらのサイトにたどり着きました。";
  std::string hex = "%E3%83%89%E3%82%A4%E3%83%84%E8%AA%9E%E3%81%A7%E6%A4%9C%E7%B4%A2%E3%81%97%E3%81%A6%E3%81%84%E3%81%A6%E3%81%93%E3%81%A1%E3%82%89%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AB%E3%81%9F%E3%81%A9%E3%82%8A%E7%9D%80%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82";
  std::wstring newja = utf8_hex_to_wstring(hex);
  std::cout << "match?=" << (newja == ja ? "yes" : "no") << std::endl;
  return 0;
}


0 commentaires

0
votes

Tout d'abord, convertir en UTF-8. Ensuite, le coode URL normal / HTML ferait la bonne chose.


0 commentaires

0
votes

Je trouve dans c # code> c'est simple, alors j'utilise c ++ \ cli code> en tant que wrapper, enveloppez C # code:

String^ encodedStr  = System::Web::HttpUtility::UrlEncode(inputStr);`.


0 commentaires