Open C Localization |
Symbian C++ supports character conversion between Unicode and other native character sets.
GNU C supports character conversion:
The following example illustrates the steps to be followed to convert from one native character set to another native character set. In GNU C it is straightforward. In Symbian C++ more lines of code are needed to do the same work. The example converts a string from the ISO-8859-1 character set to the ISO-8859-2 character set.
GNU C
#include <iconv.h> #include <stddef.h> #include <stdio.h> #include <string.h> #include <errno.h> int main (void) { iconv_t cd; const char *inbuf = "abcd"; char *outbuf = NULL;; size_t inbytes,outbytes; cd = iconv_open ("ISO-8859-2", "ISO-8859-1"); if (cd == (iconv_t) -1) { printf ("iconv_open failed errno = %d\n",errno); iconv_close(cd); return 1; } outbuf = (char*) malloc(4); inbytes = outbytes = 4 ; iconv (cd, &inbuf, &inbytes, &outbuf, &outbytes); if (iconv (cd, &inbuf, &inbytes, &outbuf, &outbytes) == (size_t) -1) printf(" errno = %d \n",errno); else printf("Iconv passed\n"); iconv_close (cd); return 1; }
SYMBIAN C++
#include <e32base.h> #include <e32cons.h> #include <charconv.h> #include <f32file.h> #include <string.h> #include <stdlib.h> LIT8(KNativeText, "abcd"); LOCAL_C int doExampleL() { char *inbuf = "abcd"; char *outbuf = NULL; int inbytes,outbytes; inbytes = outbytes = 4; TInt retVal = KErrNone; outbuf = (char*) malloc(outbytes); RFs fileSession; User::LeaveIfError(fileSession.Connect()); CleanupClosePushL(fileSession); //Allocates and constructs a CCnvCharacterSetConverter object CnvCharacterSetConverter* conv = CCnvCharacterSetConverter::NewLC() ; TPtrC8 remainderOfForeignText((const TText8*) inbuf,inbytes); TBuf16<256> UnicodeText; TBuf8<256> outputBuffer; TInt numberOfUnconvertibleCharacters = 0; TInt indexOfFirstByteOfFirstUnconvertibleCharacter = 0; //Specifies the character set(ISO-8859-1) to convert to UNICODE CCnvCharacterSetConverter::TAvailability avail = conv->PrepareToConvertToOrFromL (KCharacterSetIdentifierIso88591, fileSession); if(CCnvCharacterSetConverter::ENotAvailable == avail) { CleanupStack::PopAndDestroy(2); //conv, fileSession return KErrGeneral; } //Convert text encoded in the ISO-8859-1 character set into the Unicode character set (UCS-2). retVal = conv->ConvertToUnicode(UnicodeText, remainderOfForeignText, numberOfUnconvertibleCharacters, indexOfFirstByteOfFirstUnconvertibleCharacter); if(retVal < 0 && (retVal != CCnvCharacterSetConverter::EErrorIllFormedInput)) { CleanupStack::PopAndDestroy(2); //conv, fileSession return retVal; } //Specifies the character set(ISO-8859-2) to convert from UNICODE avail = conv->PrepareToConvertToOrFromL(KCharacterSetIdentifierIso88592, fileSession); if(CCnvCharacterSetConverter::ENotAvailable == avail) { CleanupStack::PopAndDestroy(2); //conv, fileSession return KErrGeneral; } //Convert text encoded in the Unicode character set (UCS-2) to ISO-8859-2 retVal = conv->ConvertFromUnicode(outputBuffer,UnicodeText, numberOfUnconvertibleCharacters, indexOfFirstByteOfFirstUnconvertibleCharacter); if(retVal < 0 && (retVal != CCnvCharacterSetConverter::EErrorIllFormedInput)) { CleanupStack::PopAndDestroy(2); //conv, fileSession return retVal; } TInt outputbufferLength = outputBuffer.Length(); strncpy(outbuf, (const char*) outputBuffer.Ptr(),outputbufferLength); outbuf = outbuf + outputbufferLength; CleanupStack::PopAndDestroy(2); //conv, fileSession return retVal; }
Currently Symbian C++ supports around 50 character sets, while GNU C supports more number of character sets. A list of the character sets supported in Symbian C++ can be found in the charconv.h header file.
©Nokia 2007 |