iconv-encoding-Konvertierung problem
Ich habe Probleme beim konvertieren von utf8-strings zu gb2312. Mein convert-Funktion ist unten
void convert(const char *from_charset,const char *to_charset, char *inptr, char *outptr)
{
size_t inleft = strlen(inptr);
size_t outleft = inleft;
iconv_t cd; /* conversion descriptor */
if ((cd = iconv_open(to_charset, from_charset)) == (iconv_t)(-1))
{
fprintf(stderr, "Cannot open converter from %s to %s\n", from_charset, to_charset);
exit(8);
}
/* return code of iconv() */
int rc = iconv(cd, &inptr, &inleft, &outptr, &outleft);
if (rc == -1)
{
fprintf(stderr, "Error in converting characters\n");
if(errno == E2BIG)
printf("errno == E2BIG\n");
if(errno == EILSEQ)
printf("errno == EILSEQ\n");
if(errno == EINVAL)
printf("errno == EINVAL\n");
iconv_close(cd);
exit(8);
}
iconv_close(cd);
}
Dies ist ein Beispiel, wie man es verwendet:
int len = 1000;
char *result = new char[len];
convert("UTF-8", "GB2312", some_string, result);
edit: ich habe die meisten der Zeit, erhalten Sie einen Fehler E2BIG.
- Es würde helfen, wenn du uns eine Vorstellung von dem problem. Tut es nicht kompilieren? Link? Bei der Laufzeit? Was sind die Fehler - /Ausgabe, die Sie sehen?
- Sollten Sie inptr char const*, um Verwirrung zu vermeiden und mögliche Fehler, da es nicht geändert werden.
InformationsquelleAutor user187920 | 2010-01-29
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
outleft sollte die Größe des Ausgabe-Puffers (z.B. 1000 Byte), nicht die Größe der eingehenden Zeichenfolge.
Beim konvertieren, die Länge der Zeichenfolge in der Regel Veränderungen in den Prozess, und Sie können nicht wissen, wie lange es noch sein, erst danach. E2BIG bedeutet, dass die Ausgangs-Puffer nicht groß genug ist, in welchem Fall Sie benötigen, um ihm mehr output buffer space (beachten Sie, dass es bereits umgestellt, einige der Daten und Anpassung der vier Variablen übergeben, um es entsprechend).
Als andere haben darauf hingewiesen, E2BIG bedeutet, dass die Ausgangs-Puffer nicht groß genug für die Konvertierung und Sie waren mit dem falschen Wert für outleft.
Aber ich habe auch bemerkt, dass einige andere mögliche Probleme mit der Funktion. Nämlich die Art und Weise, Ihre Funktion, Ihre Anrufer hat keine Möglichkeit zu wissen, wie viele bytes in der Ausgabe-string. Ihre convert () - Funktion weder nul-beendet den Ausgabepuffer, noch hat es eine Möglichkeit zu sagen seine Anrufer die Anzahl der bytes, die es schrieb outptr.
Wenn Sie wollen deal mit nul-beendet-strings (und es scheint, dass ' s was Sie tun möchten, da Ihre input-string ist null-terminiert), finden Sie vielleicht die folgenden Ansatz viel besser:
converted = outbuf - out;
sollteconverted = outbuf - output;
. Außerdem denke ich, dass der "Abbrechen-alles" - Lösung im Falle vonEILSEQ
übertrieben ist; siehe stackoverflow.com/questions/9249628/... für einen Fall, wo dies ein problem.