史上巨难问题,读取短信遇到回车换行符显示问题

jinzhili 2009-10-18 07:10:32
我正在做一个短信显示的小程序,
我的读取代码如下:
CRichText& richText = iSmsMtm->Body();
inboxStore->RestoreBodyTextL(richText);
const TInt length = richText.DocumentLength();
SMSContent->Des().Copy(richText.Read(0, 50));
richText.Reset();
SMSContent->Des().Trim();
iSmsItem.sContent.Copy(*SMSContent);
当短信中有回车换行时,会出现小方框这样的乱码.
如果没有回车换行显示都正常。

我用查找替换的方法进行处理后,在模拟器上可以了。
但是在真机上好像不起作用。依然还是会有小方框出现。
_LIT(KNull,"\r\n");
while(iSmsItem.sContent.Find(KNull)!= KErrNotFound)
{
TInt iPos = iSmsItem.sContent.Find(KNull);
iSmsItem.sContent.Replace(iPos,1,_L(" "));
}

请问在真机上的回车换行符不是否已不是 '\r\n'了。

使用 CnvUtfConverter::ConvertFromUnicodeToUtf8 转换后问题依然存在。
期待大侠指点,谢谢!
...全文
586 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinzhili 2009-10-19
  • 打赏
  • 举报
回复
感谢各位的回复。结帖。
jinzhili 2009-10-19
  • 打赏
  • 举报
回复
问题自己解决了。
a14776584 2009-10-19
  • 打赏
  • 举报
回复
楼上的说的对,\r\n是两个字符
alex_hua 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 jinzhili 的回复:]
_LIT(KNull,"\r\n");
while(iSmsItem.sContent.Find(KNull)!= KErrNotFound)
{
        TInt iPos = iSmsItem.sContent.Find(KNull);
        iSmsItem.sContent.Replace(iPos,1,_L(" "));
}       

请问在真机上的回车换行符不是否已不是 '\r\n'了。
[/Quote]

LZ典型标题党~

问题很简单,按你所说,假如短信中确实有"\r\n"存在,那就搜索出来替换或者换行,你上的那句调用错了,应该是
TInt iPos;
while( (iPos=iSmsItem.sContent.Find(KNull)) != KErrNotFound)
{
iSmsItem.sContent.Replace(iPos,2,_L(" ")); /* \r\n */
}

如你你自己做界面上drawtext,那碰到回车后自己控制换行显示.若是在编辑框里面显示字符内容,则把"\r\n"替换成unicode的回车码"0x2029",这样编辑框会自动处理换行
jinzhili 2009-10-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ch1oe 的回复:]
恩。。还是先输出到文件看看吧。

可以参考下面的文章:
http://www.symbianx.cn/viewthread.php?tid=34
[/Quote]

十分感谢这位朋友,待解决后,我一定总结,与大家分享。
ch1oE 2009-10-18
  • 打赏
  • 举报
回复
恩。。还是先输出到文件看看吧。

可以参考下面的文章:
http://www.symbianx.cn/viewthread.php?tid=34
jinzhili 2009-10-18
  • 打赏
  • 举报
回复
在模拟器上看到的是\n,但是在真机上好像不是。因为程序在真机上进行查找\n时根本就查不到。
ch1oE 2009-10-18
  • 打赏
  • 举报
回复
如果你觉得麻烦,那就手动弄一个回车符,然后看一下它的串值好了~
ch1oE 2009-10-18
  • 打赏
  • 举报
回复
额。这方法就多了去了。
不过,你这边的这串值,应该就可以看出一些端倪了吧~

貌似有\n的存在~
jinzhili 2009-10-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ch1oe 的回复:]
额。。有段时间不碰Symbian了。。
建议尝试先从设备上把CRichText读出来的数据通过log的方式给dump出来。然后解析一下看看到底回车符是个什么样子。

额。。方法貌似比较一般。。还是等高手吧。。。
[/Quote]

请问要如何才能把 类似这样的UNICODE的值输出到文件啊。
L"\x6211\x4EEC\n\x54AF\x7684\x8BDD\x8BF4\n\x53E5\x5B50\x6765\x3002"
这样就能看到它的回车换行符是什么了
ch1oE 2009-10-18
  • 打赏
  • 举报
回复
额。。有段时间不碰Symbian了。。
建议尝试先从设备上把CRichText读出来的数据通过log的方式给dump出来。然后解析一下看看到底回车符是个什么样子。

额。。方法貌似比较一般。。还是等高手吧。。。
韬哥的私房菜 2009-10-18
  • 打赏
  • 举报
回复
帮顶,期待高手!
csuftliang 2009-10-18
  • 打赏
  • 举报
回复
帮顶 啊
jinzhili 2009-10-18
  • 打赏
  • 举报
回复
现在不知道 从 CRichText 中读出来的数据是什么编码方式
jinzhili 2009-10-18
  • 打赏
  • 举报
回复
我用
TBuf8<20> title8 ;
TBuf<20> title16 ;
title8.Format(_L8("友情\r\n提示")) ;
ConvGbk2Uni(title8, title16) ;
CAknInformationNote* informationNote = new (ELeave) CAknInformationNote;
informationNote->ExecuteLD(title16);
在真机上测试没问题
jinzhili 2009-10-18
  • 打赏
  • 举报
回复
使用这个函数转换后还是有乱码
void CSMS3rdAppUi::ConvGbk2Uni(TDesC8& original, TDes& res)

{
RFs aFileServerSession;
aFileServerSession.Connect();
CCnvCharacterSetConverter* converter=CCnvCharacterSetConverter::NewLC();
if(converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierGbk,aFileServerSession)!=CCnvCharacterSetConverter::EAvailable)
User::Leave(KErrNotSupported);
TInt state=CCnvCharacterSetConverter::KStateDefault;
TPtrC8 str( original );
HBufC* iInfoText = HBufC::NewL( str.Length() );
TPtr16 ptr = iInfoText->Des();
if(CCnvCharacterSetConverter::EErrorIllFormedInput == converter->ConvertToUnicode(ptr, str, state))
User::Leave(KErrArgument);
res.Zero();
res.Copy(ptr);
aFileServerSession.Close();
CleanupStack::PopAndDestroy();
delete iInfoText;
}

3,120

社区成员

发帖
与我相关
我的任务
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
  • Symbian社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧