PDA字符串问题socket.字符编码问题.

yql1980   2007-10-24 21:03 楼主
问一下,
我做一个socket程序,客户端在pda,服务端在pc
但是每次从pda上发送一个字符串到pc上,为什么字符串后面都会有一个小黑块.比如像这样的.
发送:AABBBCCC
接收端:AABBBCCC■(没这么大的黑框,比"|"竖线黑点)
从PC发送中文(繁体)到PDA端刚显示乱码
PC:繁体中文     PDA:简体中文

或者从pc发到PDA:我呀我呀
如果是中文的话,显示:我呀我呀口口
会多出二个框框来.为什么呀,
PC:简体中文   PDA:简体中文
求解决方案,初步估计是编码问题,但不知道如何解决.

回复评论 (5)

自已找的一个编码方面的解决方法,明天去公司试试看看能用吗?
高手给个意见.

嵌入开发(WinCE)的一些经验[摘录] ---1
WindowsCE下Unicode和Ansi字符间互相转换的例子
纵所周知,WindowsCE下编程99%的问题都和Unicode有关.比如文件编辑,一般都保存为Ansi格式;无线通讯中控制Modem需要发送的AT指令,必须是Ansi格式;网络通讯中,PC端一般都是Ansi的,为了和PC上协议兼容,在WindowsCE中必须把要发送的一个指令从Unicode转换成Ansi格式...等等.很多初学者对于这些问题总是感到很麻烦.其实WindowsCE中有标准的API实现了Unicode和Ansi字符间的互转.下面就是网络通讯中的程序片断.
m_psocket是指向一个从CCeSocket派生的类,如果没有连接的话其为NULL;
m_snd是要发送的CString,和一个EDIT相对应.
  //发送函数片断
  void CClient1Dlg::OnButtonSend()
  {
        // TODO: Add your control notification handler code here
        if (!m_psocket) //无Socket连接,退出
        {
                MessageBox(TEXT("无连接!",TEXT("信息");
                return;
        }
        UpdateData(TRUE); //保存输入的字符串到m_snd
        unsigned char buf[129]; //发送缓冲区
        ZeroMemory(buf,sizeof(buf)); //缓冲区清零
        CString tmpstr(m_snd); //复制要发送的字符串
        int multibytelen=WideCharToMultiByte( //计算从Unicode转换到Ansi后需要的字节数
        CP_ACP, //根据ANSI code page转换
        WC_COMPOSITECHECK | WC_DEFAULTCHAR, //转换出错用缺省字符代替
        tmpstr.GetBuffer(m_snd.GetLength()), //要转换的字符串地址
                m_snd.GetLength(), //要转换的个数
                0, //转换后字符串放置的地址
                0, //最多转换字符的个数,为0表示返回转换Unicode后需要多少个字节
                0, //缺省的字符:"\0"
                0 //缺省的设置
         ;
        WideCharToMultiByte( //转换Unicode到Ansi
                CP_ACP,
                WC_COMPOSITECHECK | WC_DEFAULTCHAR,
                tmpstr.GetBuffer(m_snd.GetLength()),
                m_snd.GetLength(),
                (char *)buf, //转换到缓冲区中
                128, //最多128个字节
                0,
                0
          ;
        int sendcount=m_psocket->Send(buf,multibytelen+1); //发送转换后的缓冲区
        CString statusstr;
        statusstr.Format(TEXT("共发送字节数:%d",sendcount);
        m_status.SetWindowText(statusstr); //更新显示栏
  }
程序接收到的字符串最后保存到CString tmpstr中.
  //接收函数片断
  void MyCeSocket::OnReceive(int nErrorCode)
  {
        // TODO: Add your specialized code here and/or call the base class
        unsigned char p[129]; //接受缓冲区
        ZeroMemory(p,sizeof(p)); //接收缓冲区清零
        this->Receive(p,128); //接收128个字节
        int widecharlen=MultiByteToWideChar( //计算从Ansi转换到Unicode后需要的字节数
                CP_ACP,
                MB_COMPOSITE,
                (char*)p, //要转换的Ansi字符串
                -1, //自动计算长度
                0,
                0
        ;
        CString tmpstr;
        tmpstr.GetBuffer(widecharlen); //为转换后保存Unicode字符串分配内存
        MultiByteToWideChar( //从Ansi转换到Unicode字符
                CP_ACP,
                MB_COMPOSITE,
                (char*)p,
                -1,
                tmpstr.GetBuffer(widecharlen), //转换到tmpstr
                widecharlen //最多转换widecharlen个Unicode字符
        ;
        m_clientdlg->m_listbox.InsertString(0,tmpstr); //插入到listbox中显示
        CCeSocket::OnReceive(nErrorCode);
  }
注意:以上代码都是在WindowsCE样板机上运行,PC端发送和接收到的字符均为Ansi格式的.把以上代码稍微修改一下用到自己的产品中,就可以利用以前的协议无缝连接PDA和PC.
以上代码在MicroSoft Embed Visual C++ 3.0 + 联想天玑5100(WindowsCE3.0)
点赞  2007-10-24 21:50
LZ看一下是不是字符编码的问题
好像字符编码有UTF-8,ANSI,UNICODE等不同类型吧,是不是PDA端的字符编码不一样啊
点赞  2007-10-25 09:49
这个是你的代码错误,不调试没法解决的。
点赞  2007-10-25 14:40
同意楼上的,楼主自己调试调试,看看黑块的值是什么。
点赞  2007-10-25 16:19
其实不是黑块,
是一根"|"竖线,

我用WideCharToMultiByte转好后不再出现了.


但是问题又来了.
我的PC机端是繁体中文的,数据库里的值也是繁体字,
PDA是简体中文的操作系统,
现在从PC发送繁体中到PDA上显的都是乱码.

现在还不知道是怎么关系,如果是简体中文的话,从PC端发的字体是ansi的,
到pda 后变成unicode的,对吗?

但目前是繁体的,PC端送的繁体字是什么编码?如何能看到?
到PDA端后该如何转换?
高手请指教?如有代码最好.
点赞  2007-10-25 20:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复