学习笔记之vc 6.0 下 含中文字符串 字符长度 获取及截取

来源:互联网 发布:java讲师容易吗 编辑:程序博客网 时间:2024/04/29 14:05

今天在看 vc++ 深入详解时,字符输入内容时,自己突然想输入汉字测试程序,

源程序的两句是

int s= m_input.GetLength();

  m_input=m_input.Left(s-1);

m_input 是CString ,程序是mfc

结果输入汉字,测试时,会出现乱码,因为一个汉字两个字节。到网上找了一下午的解决方案,老是出问题。

最后还是参考这个,得出方法

http://bbs.csdn.net/topics/330118156

就是修改 编译器的编码设置,我当前的是ansi,属于mbcs(多字节)编码方式,修改为unicode编码方式(所有的字母,汉字都是双字节)。

设置可以参考

http://blog.csdn.net/maweiqi/article/details/7801281

 

设置后,我程序出错了

m_input=m_input+nChar;

这一句报错,说+号重载不明确,我看确实有很多重载,我就试了几个发现 强制转为 TCHAR 就没问题了。 m_input=m_input+(TCHAR)nChar;

 

 

查询的时候,还看了一下其他的问题解决,也有参考价值:

http://bbs.csdn.net/topics/70245081

 

前面查询一个解决方案说,可以直接用CStringW来定义m_input。可是我在vc6里面用不了CStringW,说未定义,不知道怎么解决,查询说貌似vc6是mfc 4.0,CStringW是mfc9.0的东西,不过不知道怎么把vc6的mfc4.0改为mfc9.0,mfc9.0下载下来是个dll,而vc6按照目录下不是mfc4.0.dll,不知道怎么弄,估计要换个高级的编译器吧。

 

 

相关代码

void CTest12View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); TEXTMETRIC tm; dc.GetTextMetrics(&tm); if (nChar==0x0d) {  m_input.Empty();  m_caretpoint.y+=tm.tmHeight;  SetCaretPos(m_caretpoint); } else if (nChar==0x08) {  COLORREF cr=dc.SetTextColor(dc.GetBkColor());  dc.TextOut(m_caretpoint.x,m_caretpoint.y,m_input);  int s= m_input.GetLength();  m_input=m_input.Left(s-1);  dc.SetTextColor(cr); } else {  m_input=m_input+(TCHAR)nChar; }  CSize cs=dc.GetTextExtent(m_input); POINT pt; pt.x=m_caretpoint.x+cs.cx; pt.y=m_caretpoint.y; SetCaretPos(pt); dc.TextOut(m_caretpoint.x,m_caretpoint.y,m_input); CView::OnChar(nChar, nRepCnt, nFlags);}


 

 

0 0