CStdioFile的ReadString读入中英文的总结(unicode-ucs2/utf8-无bom/ansi) .

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu  转载请标明来源 

 

文章的前提:

1. 使用ReadString来读取字符串.  sizeof(TCHAR) == 2 为 wchar_t.  // 原因通常TCHAR == char时,通常使用不会有问题发生,所以文章不再讨论。

2. 读本文之前,建议先读一下WriteString写入的总结: http://blog.csdn.net/chunyexiyu/article/details/8938540  里面的内容和这个ReadString关联比较大,里面有介绍原理性的东西。

 

1. Read文本为utf8/ansi格式:

这种情况下,使用ReadString读入效果不理想,详见下面说明:

utf8/ansi情况下,不能使用binary打开然后ReadString,因为这种模式下,一次按照TCHAR的大小,读取两个字符,结束符号0d的话,需要读取到0x 0d 00才会认为是读取一行结束。而我们知道untf8/ansi情况存储的话,里面是没有0x00存在的。

utf8/ansi情况下,使用typetext打开然后ReadString,可以把字符读入到CString里面,但存储是按照每次存一个字节到TCHAR中的。

CString里面存储的信息为:每个TCHAR存储一个字节的信息(Char)

例如:文件有100个字节,同时包含有种英文,读入到CString种,就会是100个长度

例如:ASNI格式的内容  abc内蒙古 (0x61 62  63 C4 DA C3 C9 B9 C5) 3+2*3 =9

typetext读入到CString种,长度为9,CString转TCHAR*的字符串为

61 00 (little endian,低字节在前,高字节在后) 

62 00 

63 00  

C4 00

DA 00

C3 00

C9 00

B9 00

C5 00

 utf8/ansi文件情况下,建议使用Binary打开,然后使用Read来读取,一个字节一个字节的读取,直到读取到'\0'为止,这样就能读取一个完整的uft8/ansi字符串。再把这个字符串转换成unciode赋值给CString变量。

2. Read文本为unicode格式:

这种情况下,使用binary方式读入效果比较理想:

unicode情况下:不能使用typetext方式打开ReadString,因为unicode下,文件中的内容 如abc在文件中存储为 61 00 62 00 63 00,ReadString在typetext模式下,一个字节一个字节来读入到CString中,遇到0x00,读入到CString就异常了,就不是我们想要的了。CString中是不能再中间某一位存储0x00的。

 

unicode模式下,建议使用binary模式打开ReadString,先seek到第3个字节(前两个字节是unicode的标示符号),然后使用ReadString来读取。Binary模式下,是按照TCHAR的大小,一次读取两个字符,这样就不存在一个一个字符读取到0x00的问题。

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夜喜雨

稀罕你的喜欢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值