2011-01-16 8 views
-1

Ich habe Probleme mit der Konvertierung von UTF-8 in Unicode.UTF-8 zu Unicode-Konvertierung

Unten ist der Code:

int charset_convert(char * string, char * to_string,char* charset_from, char* charset_to) 
{ 
    char *from_buf, *to_buf, *pointer; 
    size_t inbytesleft, outbytesleft, ret; 
    size_t TotalLen; 
    iconv_t cd; 

    if (!charset_from || !charset_to || !string) /* sanity check */ 
     return -1; 

    if (strlen(string) < 1) 
     return 0; /* we are done, nothing to convert */ 

    cd = iconv_open(charset_to, charset_from); 
    /* Did I succeed in getting a conversion descriptor ? */ 
    if (cd == (iconv_t)(-1)) { 
     /* I guess not */ 
     printf("Failed to convert string from %s to %s ", 
       charset_from, charset_to); 
     return -1; 
    } 
    from_buf = string; 
    inbytesleft = strlen(string); 
    /* allocate max sized buffer, 
     assuming target encoding may be 4 byte unicode */ 
    outbytesleft = inbytesleft *4 ; 
    pointer = to_buf = (char *)malloc(outbytesleft); 
    memset(to_buf,0,outbytesleft); 
    memset(pointer,0,outbytesleft); 

     ret = iconv(cd, &from_buf, &inbytesleft, &pointer, &outbytesleft);ing 
    memcpy(to_string,to_buf,(pointer-to_buf); 
} 

main():

int main() 
{  
    char UTF []= {'A', 'B'}; 
    char Unicode[1024]= {0}; 
    char* ptr; 
    int x=0; 
    iconv_t cd; 

    charset_convert(UTF,Unicode,"UTF-8","UNICODE"); 

    ptr = Unicode; 

    while(*ptr != '\0') 
    { 
     printf("Unicode %x \n",*ptr); 
     ptr++; 
    } 
    return 0; 
} 

Es A geben sollte und B, aber ich bin immer:

ffffffff 
fffffffe 
41 

Danke, Sandeep

+4

Können Sie Ihre Frage ein wenig beheben? Es ist ziemlich unlesbar wie es ist. Außerdem macht "UTF-8 nach Unicode-Konvertierung" keinen Sinn. Unicode ist eine Spezifikation und UTF-8 ist ein "Format" zum Speichern von Daten zur Verwendung in Unicode-bezogenen Feldern. – soc

+0

Hast du versucht zu verstehen, was es tut oder hast du es einfach irgendwo kopiert (von den Zeilennummern überall zu urteilen)? – soc

+0

Dank Soc, Ich ging durch den unten genannten Link und versuchte zu verstehen, ob Unicode Binary-Darstellung und entsprechende UTF-8 sind unterschiedlich. – sandeep

Antwort

0

UTF-8 i s Unicode.

Sie müssen nicht verdeckte, wenn Sie eine andere Art von Unicode-Codierung wie UTF-16 benötigen oder UTF-32

+2

UTF-8 ist ein Teil von Unicode. – BlackBear

+0

@BlackBear: Ich denke er weiß das und das ist nicht sein Punkt. Kein Grund zum Downvote. – soc

+0

@Artyom: Ich habe dich nicht downvote. Ich habe nur unhöfliche oder falsche Antworten abgelehnt. – BlackBear

0

UTF ist nicht Unicode. UTF ist eine Codierung der Ganzzahlen im Unicode-Standard. Die Frage, wie es ist, macht keinen Sinn. Wenn Sie meinen, dass Sie von einem (beliebigen) UTF in den Unicode-Codepunkt konvertieren möchten (dh die ganze Zahl, die für einen zugewiesenen Codepunkt steht, ungefähr ein Zeichen), müssen Sie ein wenig lesen, aber es handelt sich um Bitverschiebung für die Werte der 1, 2, 3 oder 4 Bytes in UTF-8 Bytesequenz (siehe Wikipedia, während Markus Kuhn's Text ist auch hervorragend)

2

Es sieht aus wie Sie bekommen UTF-16 in einem kleinen Endian-Format:

ff fe 41 00 ... 

Welche ist U + FEFF (ZWNBSP aka Bytereihenfolgemarkierung), U + 0041 (lateinischer Großbuchstabe A), ...

Sie dann pri stoppen nting, weil Ihre while-Schleife beim ersten Nullbyte beendet wurde. Die folgenden Bytes sollten sein: 42 00.

sollten Sie entweder zurückgeben eine Länge von Ihrer Funktion oder stellen Sie sicher, dass die Ausgabe mit einem Null-Zeichen (U + 0000) und Schleife beendet wird, bis Sie diese finden.

+0

Sie haben natürlich Recht, aber ich denke, es gibt ein tieferes konzeptionelles Problem in der OP-Frage, das geklärt werden muss, bevor Ihre Antwort Sinn ergibt. Auf jeden Fall, upvote. –

0

Es sei denn, ich bin etwas fehlt, da niemand es aus noch hingewiesen hat „UNICODE“ ist keine gültige Codierung Namen in libiconv, wie es der Name einer Familie von Kodierungen ist.

http://www.gnu.org/software/libiconv/

(edit) Eigentlich iconv -l zeigt UNICODE als börsennotierten Eintrag, aber keine Einzelheiten in dem Quellcode seine aufgeführt im Anhang als Alias ​​für UNICODE-LITTLE aber in dem subnotes es erwähnt:

* UNICODE (big endian), UNICODEFEFF (little endian) 
    We DON'T implement these because they are stupid and not standardized. 

In den Aliasnamen header-Dateien UNICODELITTLE (kein Bindestrich) löst wie folgt:

lib/aliases.gperf:UNICODELITTLE, ei_ucs2le 

dh UCS2-LE (UTF-16 Little Endi a), die Windows-interne "Unicode" -Encodierung entsprechen sollte.

http://en.wikipedia.org/wiki/UTF-16/UCS-2

immer Sie eindeutig explizit UCS2-LE oder UCS2-BE es sei denn, die ersten Bytes sind ein Byte Order Mark (BOM) Wert 0xFEFF, um anzuzeigen, Byte-Reihenfolge Schema empfohlen werden zu spezifizieren.

=> Sie sehen die Stückliste als die ersten Bytes der Ausgabe, denn das bedeutet der Kodierungsname "UNICODE", also UCS2 mit einem Header, der das Byte-Reihenfolge-Schema angibt.