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