Symbian下Utf8和Unicode互换转存的一些总结

来源:互联网 发布:php简单工作流 编辑:程序博客网 时间:2024/05/22 06:53

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)读取文件来完成