c#客户端SOCKET接收中文乱码

oubenruing 2013-08-30 05:34:16
server
是c++写的执行sql语句从oracle数据库中查询内容通过socket发送;c++编译默认编码是unicode


_RecordsetPtr Rp=connect.GetRecordset(sql);
_variant_t varUserName;
string strUserName;
varUserName = Rp->GetCollect ("TICKETCODE");//票号
strUserName=strUserName+(char *)_bstr_t(varUserName);
strUserName=rtrim(strUserName);
send(clientSocket,strUserName.c_str(),strUserName.length(),0);


client:
c++写的windows窗体应用程序客户端接收不会乱码;
是c#写的WP客户端接收以后乱码 相关代码如下;


string response = "something";
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);//个人猜测是这里设置编码有问题
response = response.Trim('\0');

改成如下代码也不行

response = Encoding.unicode.GetString(e.Buffer, e.Offset, e.BytesTransferred);

求助啊啊啊
...全文
475 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hab515 2014-05-12
  • 打赏
  • 举报
回复
Encoding.GetEncoding("gb18030").GetString(e.Buffer, e.Offset, e.BytesTransferred); 真的能解决中文显示?乱码问题 我以前的是: Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
oubenruing 2013-09-02
  • 打赏
  • 举报
回复
引用 2 楼 rtdb 的回复:
我觉得C++发出来的不一定是Unicode。 你直接输出e.Buffer看一看。
额 怎么直接输出byte类型呀。。 我的服务器端是64位写的。。求大神帮助啊
oubenruing 2013-09-02
  • 打赏
  • 举报
回复
引用 3 楼 todd_leftcode 的回复:
那就试试 Encoding.Default (或者 Encoding.GetEncoding("gb18030")) 如果要刨根问底, 那就查一下 oracle 是以什么编码返回字符串的(应该是叫当前连接或当前会话的编码吧,oracle不熟), 这个编码跟你VC++工程用什么编码没有关系的。 同时注意rtrim是否能正确处理这种编码格式的字符串。
Encoding.Default 显示错"System.Text.Encoding"并不包含"Default"定义 Encoding.GetEncoding("gb18030")我试过还是乱码 oracle也是unicode呀 rtrim定义如下

string rtrim(string &s)
 {
 const string &space =" \f\t\r\v" ;
 return s.erase(s.find_last_not_of(space)+1);
 }
头疼啊
todd_leftcode 2013-09-02
  • 打赏
  • 举报
回复
引用 4 楼 oubenruing 的回复:
[quote=引用 3 楼 todd_leftcode 的回复:] 那就试试 Encoding.Default (或者 Encoding.GetEncoding("gb18030")) 如果要刨根问底, 那就查一下 oracle 是以什么编码返回字符串的(应该是叫当前连接或当前会话的编码吧,oracle不熟), 这个编码跟你VC++工程用什么编码没有关系的。 同时注意rtrim是否能正确处理这种编码格式的字符串。
Encoding.Default 显示错"System.Text.Encoding"并不包含"Default"定义 Encoding.GetEncoding("gb18030")我试过还是乱码 oracle也是unicode呀 rtrim定义如下

string rtrim(string &s)
 {
 const string &space =" \f\t\r\v" ;
 return s.erase(s.find_last_not_of(space)+1);
 }
头疼啊[/quote] unicode 我倾向于指字符集, 编码分 utf-8, utf-16, ucs2, utf-32, 不知道是哪一种?
oubenruing 2013-09-02
  • 打赏
  • 举报
回复
引用 3 楼 todd_leftcode 的回复:
那就试试 Encoding.Default (或者 Encoding.GetEncoding("gb18030")) 如果要刨根问底, 那就查一下 oracle 是以什么编码返回字符串的(应该是叫当前连接或当前会话的编码吧,oracle不熟), 这个编码跟你VC++工程用什么编码没有关系的。 同时注意rtrim是否能正确处理这种编码格式的字符串。
据说是转成GB18030 但是
response = Encoding.GetEncoding("gb18030").GetString(e.Buffer, e.Offset, e.BytesTransferred);
会报错啊 无语了
todd_leftcode 2013-08-30
  • 打赏
  • 举报
回复
那就试试 Encoding.Default (或者 Encoding.GetEncoding("gb18030")) 如果要刨根问底, 那就查一下 oracle 是以什么编码返回字符串的(应该是叫当前连接或当前会话的编码吧,oracle不熟), 这个编码跟你VC++工程用什么编码没有关系的。 同时注意rtrim是否能正确处理这种编码格式的字符串。
rtdb 2013-08-30
  • 打赏
  • 举报
回复
我觉得C++发出来的不一定是Unicode。 你直接输出e.Buffer看一看。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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