J'essaie donc de lire un email, il est codé en impressionnable cité et contient donc par exemple: qui doit être converti en p> Donc, je reçois que c3b6 est la représentation hexagonale de la valeur J'utilise Linux mais portera le code à Windows, mais Je veux une solution multiplateform pour cela. P> Comment puis-je faire cela? P> p> utf-8 code>
ö code>, mais je ne comprends pas comment convertir un
char * str = '= c3 = b6' code> dans
char * str 'ö' code>. p>
3 Réponses :
Voici quelque chose qui devrait vous aider à démarrer.
Je l'ai testé et il semble fonctionner pour l'entrée que vous avez donnée. Il a certains em> vérification des erreurs, mais pas beaucoup. P>
@chux merci. Cela a également eu d'autres problèmes aussi. J'ai codé [et testé] le programme complet
quelque chose pour obtenir OP a commencé.
Analysez la chaîne "= c3 = b6" code>, à la recherche de 2 octets comme des caractères hexadécimaux. Ensuite, formez une chaîne à imprimer (et espoir
printf code> interprétera sous UTF-8) - complétants conformes à
printf ("% s", ...) code> n'ont "pas de spécial Les dispositions sont faites pour les personnages multibytes ». YMMV . P>
=C3=B6
1 ö
2 ö
3 ö
Décodage COSTED-IMPIABLE Strings implique trois choses:
ignorer les nouvelles lignes douces. Ce sont convert Il existe trois approches principales pour décoder des données: p> filtre d'entrée. Au lieu d'E.G. conversion vers un nouveau tampon. Voir la conversion en place. Ceci est possible, car chaque chaîne valide imprimable-imprimable indiquée est au moins aussi longue que le même décodé. P> li>
ol> filtre d'entrée. Pour la simplicité, regardons un caractère à la fois. (Notez que de nombreux caractères UTF-8 sont plus longs qu'un char.) P> Premièrement, nous avons besoin d'une fonction d'assistance pour convertir des caractères hexadécimaux à leurs valeurs arithmétiques respectives: P> = code> suivi d'une nouvelle ligne. P> li>
= code> suivi de deux chiffres hexadécimaux, au caractère dont le code correspond à cette valeur hexadécimale p> li>
ul>
fgetc () code>, vous utilisez une fonction qui lit et décode l'entrée imprimable citée. p> li>
Convert () Code> Fonction dans Craig Esteys Répondez à cette même question. P> li>
size_t decode_quoted_printable(char *dst, const char *src)
{
const char *const origin = dst;
/* Neither pointer may be NULL. src == dst is okay, however. */
if (!dst || !src) {
errno = EINVAL;
return 0;
}
/* Copy loop. */
while (*src)
if (*src == '=') {
if (src[1] == '\0') {
/* '=' at the end of string. Skipped. */
break;
} else
if (src[1] == '\n') {
/* Soft newline. Skip both =\n and =\n\r newlines. */
if (src[2] == '\r')
src += 3;
else
src += 2;
} else
if (src[1] == '\r') {
/* Soft newline. Skip both =\r and =\r\n newlines. */
if (src[2] == '\n')
src += 3;
else
src += 2;
} else {
const int hi = hex_digit((unsigned char)(src[1]));
const int lo = hex_digit((unsigned char)(src[2]));
if (hi >= 0 && lo >= 0) {
*(dst++) = lo + 16*hi;
src += 3;
} else {
/* Error in input format. We are permissive,
and reproduce the erroneous `=XY` as-is. */
*(dst++) = *(src++);
}
}
} else
if (*src == '\n') {
if (src[1] == '\r')
src += 2;
else
src += 1;
*(dst++) = '\n';
} else
if (*src == '\r') {
if (src[1] == '\n')
src += 2;
else
src += 1;
*(dst++) = '\n';
} else
*(dst++) = *(src++);
/* Terminate result to make it a string. */
*dst = '\0';
/* Just in case the source was an empty string, we clear
errno to zero. This also means we always set errno,
which is a bit rare, but makes the use of this function
easy: errno is nonzero iff there was an error. */
errno = 0;
return (size_t)(dst - origin);
}
iveqy, voir personnage Unicode "Ö" et rechercher utf- 8 Encodage: I>. Est-ce suffisant?
@chux non, cela me dit simplement que Ö a la représentation hexagonale UTF-8 de C3B6, mais je le sais déjà. Ma question est de savoir comment je peux convertir la chaîne = C3 = B6 en binaire (je crois). De sorte que la chaîne STR imprime Ö avec PrintF ('% S \ N', STR)
C a cette note de bas de page sur
fprintf () code> et
s code>: "Aucune disposition spéciale n'est faite pour les caractères multibytes". Une solution multiplateform ne fonctionnera donc pas nécessairement sur toutes les plateformes. Quelle sortie obtenez-vous avec
printf ("% s \ n", "\ xc3 \ xb6") code>? Avec
printf ("% s \ n", "Ö") code>?
Les deux impressions Ö, alors mon seul pas (et celui que j'ai vraiment lutte avec) est de savoir comment aller de const char * str = "= c3 = b6"; à char * str = "\ c3 \ b6" 1 #include "stdio.h" 2 3 int main () 4 {5 char * str = "= C3 = B6"; 6 printf ("% s \ n", "Ö"); 7 printf ("% s \ n", "\ xc3 \ xb6"); 8 printf ("% s \ n", str); 9 pour (int i = 0; i <6; i ++) {10 si (str [i] == '=') {11 str [i] = '\\'; 12} 13} 14 printf ("% s \ n", str); 15 retour 0; 16} Défaut SEG
Il est ub de tenter de modifier un littéral de chaîne comme
"\ c3 \ b6" code>. C'est la source de défaut SEG.
Jetez un coup d'œil à la bibliothèque de Mime Chilkat. Le formulaire que vous utilisez est
cité-imprimable code> d'un
entité uf-8 code>. Il ne devrait pas y avoir besoin d'écrire un code personnalisé pour cela.