Symbian下Utf8和Unicode互換轉存的一些總結

Symbian下Utf8和Unicode互換轉存的一些總結

 

1。讀取Utf8文本轉換後存儲爲Uncoide文本

(這裏有個可以稱爲錯誤的問題,就是對於文件操作的原則就是用什麼讀就要用什麼寫,

所以file.Read(tp)與outputFileStream.WriteL(*unicode)結果正確但存在風險)

void Utf82Unicode()

{

RFs fs;

fs.Connect();

RFile file;

file.Open(fs, _L("c://data//utf8.txt"), EFileRead);

HBufC8* utf8 = NULL;

TInt size = 0;

file.Size(size);

utf8 = HBufC8::NewLC(size);

TPtr8 tp = utf8->Des();

file.Read(tp);

file.Close();

 

 

HBufC* unicode = CnvUtfConverter::ConvertToUnicodeFromUtf8L(tp);

file.Replace(fs, _L("c://data//unicode.txt"), EFileWrite);

CleanupClosePushL(file);

 

RFileWriteStream outputFileStream(file);

CleanupClosePushL(outputFileStream);

outputFileStream.WriteL(*unicode);

 

CleanupStack::PopAndDestroy(2); // outputFileStream, file

 

fs.Close();

CleanupStack::PopAndDestroy();

delete unicode;

}

 

2。讀取Utf8文本轉換後存儲爲Uncoide文本的第二種方法

 

TInt UnicodeLittleFromUnicodeBig(const TDesC& aBigDes,TDes8& aLittleDes) 

{

RFs fs;

fs.Connect();

CCnvCharacterSetConverter* iConv = NULL;

iConv = CCnvCharacterSetConverter::NewLC();

if(NULL != iConv)

{

if(iConv->PrepareToConvertToOrFromL(KCharacterSetIdentifierUnicodeLittle,

fs)!=CCnvCharacterSetConverter::EAvailable)

{

fs.Close();

User::Leave(KErrNotSupported);

}

iConv->ConvertFromUnicode(aLittleDes, aBigDes);

CleanupStack::PopAndDestroy() ;

}

else

{

fs.Close();

return KErrNotSupported;

}

fs.Close();

return KErrNone;

}

 

void Utf82Unicode()

{

RFs fs;

fs.Connect();

RFile file;

file.Open(fs, _L("c://data//utf8.txt"), EFileRead);

HBufC8* utf8 = NULL;

TInt size = 0;

file.Size(size);

utf8 = HBufC8::NewLC(size);

TPtr8 tp = utf8->Des();

file.Read(tp);

file.Close();

HBufC* unicode = CnvUtfConverter::ConvertToUnicodeFromUtf8L(tp);

CleanupStack::PopAndDestroy();// utf8

HBufC8* unicode8 = HBufC8::NewL(unicode->Length() * 2);

TPtr8 tpUnicode8 = unicode8->Des();

UnicodeLittleFromUnicodeBig(*unicode, tpUnicode8);

delete unicode;

file.Replace(fs, _L("c://data//utf82unicode.txt"), EFileWrite);

CleanupClosePushL(file);

file.Write(*unicode8);

 

CleanupStack::PopAndDestroy(); // file

fs.Close();

delete unicode8;

}

 

3。讀取Uncoide文本轉換後存儲爲utf8文本

 

void UnicodeLittleToUnicodeBig(TDes& aBigDes, const TDesC8& aLittleDes)

{

RFs fs;

fs.Connect();

CCnvCharacterSetConverter* converter = CCnvCharacterSetConverter::NewLC();

if (converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierUnicodeLittle,

fs) == CCnvCharacterSetConverter::EAvailable)

{

 

// Do nothing about it

}

 

TInt state = CCnvCharacterSetConverter::KStateDefault;

 

if (CCnvCharacterSetConverter::EErrorIllFormedInput

== converter->ConvertToUnicode(aBigDes, aLittleDes, state))

{

fs.Close();

CleanupStack::PopAndDestroy();

User::Leave(KErrArgument); // Leave if error in conversion.

}

 

CleanupStack::PopAndDestroy(); // Clean for converter

fs.Close();

}

 

void Unicode2Utf8()

{

RFs fs;

fs.Connect();

RFile file;

file.Open(fs, _L("c://data//unicode.txt"), EFileRead);

TInt size = 0;

file.Size(size);

HBufC8* unicode8 = HBufC8::NewL(size);

TPtr8 tpU8 = unicode8->Des();

file.Read(tpU8);

HBufC* unicode16 = HBufC::NewL(size);

// unicode16->Des().Copy(tpU8);

TPtr tpU16 = unicode16->Des();

UnicodeLittleToUnicodeBig(tpU16, *unicode8);

delete unicode8;

file.Close();

HBufC8* utf8 = HBufC8::NewL(size);

TPtr8 tpUtf8 = utf8->Des();

CnvUtfConverter::ConvertFromUnicodeToUtf8(tpUtf8, *unicode16);

file.Replace(fs, _L("c://data//unicode2utf8.txt"), EFileWrite);

file.Write(tpUtf8);

delete unicode16;

fs.Close();

}

 

4。讀取Uncoide文本轉換後存儲爲utf8文本的第二種方法參考1使用RFileReadStream繼承與基類RReadStream中的ReadL(TDes16& aDes)讀取文件來完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章