编码转换问题:UCS2码如何转换成GB2312?

xjjdanran 2006-02-24 08:34:37
如题,应该如何处理?
...全文
688 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjjdanran 2006-02-27
  • 打赏
  • 举报
回复
谢谢windowslee(),我问题已经解决了,是我接受短信结构定义不合理,本来应该是byte[]的,接受时强制转换成string了,所以难以在转回来.如果是byte[]可以按你的方法直接转了.

http://community.csdn.net/Expert/topic/4575/4575305.xml?temp=4.284084E-03
这个贴早结了,前两天休息,没上来了,现在结贴吧.

dkxjj@hotmail.com,希望交个朋友!
xjjdanran 2006-02-24
  • 打赏
  • 举报
回复
自己再UP一下,还请诸位老大们多多帮忙啊
windowslee 2006-02-24
  • 打赏
  • 举报
回复
我找到我移动的程序了,信息字段对不同编码是这样处理的:
public string getMsg_Content()
{
string strMsg="";
switch(this.getMsg_Fmt())
{
case 15:
strMsg=Encoding.Default.GetString(this.Msg_Content);
break;
case 8:
strMsg=Encoding.BigEndianUnicode.GetString(this.Msg_Content);
break;
case 0:
strMsg=Encoding.ASCII.GetString(this.Msg_Content);
break;

}
return strMsg;

}
zlz_212 2006-02-24
  • 打赏
  • 举报
回复
mark
xjjdanran 2006-02-24
  • 打赏
  • 举报
回复
我们现在是暂时将发送和接收功能实现了,MT消息是中文没问题,API内部处理了吧;可MO时,发送的是字母与数据,也正常,但带了汉字就为乱码了。我们老大还希望下午能带过去给客户演示一番,晕
xjjdanran 2006-02-24
  • 打赏
  • 举报
回复
非常感谢,问题催得比较急,能转换的话,麻烦你帮我将上面的代码改下吧,好的话,我可以另外开贴再放分。
fuzi1982 2006-02-24
  • 打赏
  • 举报
回复
Response.Clear();
Response.Buffer=true;
Response.AddHeader("Content-Disposition","attachment;filename="+HttpUtility.UrlEncode(ttt,System.Text.Encoding.UTF8)+".xls");
Response.ContentType ="application/vnd.ms-excel";//?置?出文件?型?excel文件。
Response.Charset= "";
this.EnableViewState=false;
System.IO.StringWriter oStringWriter=new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter oHtmlTextWriter=new System.Web.UI.HtmlTextWriter(oStringWriter);
DataGrid1.RenderControl(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());
Response.End();

代码如上:现在的问题是,直接保存,文件名正常,当直接打开时,文件名是乱码~,文件名是日语,是编码的问题么?
xjjdanran 2006-02-24
  • 打赏
  • 举报
回复
byte[] b_MsgContent=Encoding.BigEndianUnicode.GetBytes(strMsgContent);
byte[] newbyte = Encoding.Convert(Encoding.BigEndianUnicode, Encoding.ASCII, b_MsgContent, 0, b_MsgContent.Length);
string V_newStr = ASCIIEncoding.GetEncoding("GB2312").GetString(newbyte);

这样转换之后还是乱码??
windowslee 2006-02-24
  • 打赏
  • 举报
回复
//cmpp3.0:deliver类

public class Deliver
{
public HEAD Header;
public Report report;
public ulong Msg_Id;
public byte[] Dest_Id=new byte[21];
public byte[] Service_Id=new byte[10];
public byte TP_pid;
public byte TP_udhi;
public byte Msg_Fmt;
public byte[] Src_terminal_Id=new byte[32];
public byte Src_terminal_type;
public byte Registered_Delivery;
public byte Msg_Length;
public byte[] Msg_Content; /* *** */
public byte[] LinkID=new byte[20];

public int getStrlen(byte[] buffer)
{
int i=0;
for(i=0;i<buffer.Length;i++)
{
if(buffer[i]==0)
{
return i;
}
}
return buffer.Length;
}

public Deliver()
{
Header=new HEAD();

}


public string bcdtostring(byte[] b_bcd)
{
string[] strbcd=new string[b_bcd.Length];
string output="";
for(int i=0;i<b_bcd.Length;i++)
{
strbcd[i]=System.Convert.ToString(b_bcd[i],16);
if(strbcd[i].Length==1)
{
strbcd[i]="0" + strbcd[i];
}
output=output + strbcd[i];
}

return output;
}

public void Deliver_unpack(byte[] b_Deliver)
{
int i=0;
Header.HEAD_unpack(b_Deliver);
i+=12;

byte[] buffer_msgid = new byte[8];
Buffer.BlockCopy(b_Deliver, i, buffer_msgid, 0, buffer_msgid.Length);
Array.Reverse(buffer_msgid);
this.Msg_Id= BitConverter.ToUInt64(buffer_msgid,0);
i+=8;

Buffer.BlockCopy(b_Deliver,i,this.Dest_Id,0,this.Dest_Id.Length);
i+=21;

Buffer.BlockCopy(b_Deliver,i,this.Service_Id,0,this.Service_Id.Length);
i+=10;

this.TP_pid=b_Deliver[i];
i+=1;

this.TP_udhi=b_Deliver[i];
i+=1;

this.Msg_Fmt=b_Deliver[i];
i+=1;

Buffer.BlockCopy(b_Deliver,i,this.Src_terminal_Id,0,this.Src_terminal_Id.Length);
i+=32;

this.Src_terminal_type=b_Deliver[i];
i+=1;

this.Registered_Delivery=b_Deliver[i];
i+=1;

this.Msg_Length=b_Deliver[i];
i+=1;

if(this.Registered_Delivery==0)
{
this.Msg_Content=new byte[this.Msg_Length];
Buffer.BlockCopy(b_Deliver,i,this.Msg_Content,0,this.Msg_Content.Length);
i+=this.Msg_Length;
}
else if(this.Msg_Length==71)
{
//状态报告
report=new Report();
byte[] b_Report=new byte[71];
Buffer.BlockCopy(b_Deliver,i,b_Report,0,b_Report.Length);
report.Report_unpack(b_Report);
i+=b_Report.Length;
}

Buffer.BlockCopy(b_Deliver,i,this.LinkID,0,this.LinkID.Length);
i+=20;
}
public string getMsg_Id()
{
byte[] buffer=BitConverter.GetBytes(this.Msg_Id);
Array.Reverse(buffer);
return bcdtostring(buffer);
}
public string getDest_Id()
{
return Encoding.ASCII.GetString(this.Dest_Id,0,getStrlen(this.Dest_Id));
}
public string getService_Id()
{
return Encoding.ASCII.GetString(this.Service_Id,0,getStrlen(this.Service_Id));
}
public int getTP_pid()
{
return this.TP_udhi;
}
public int getTP_udhi()
{
return this.TP_pid;
}
public int getMsg_Fmt()
{
return this.Msg_Fmt;
}
public string getSrc_terminal_Id()
{
return Encoding.ASCII.GetString(this.Src_terminal_Id,0,getStrlen(this.Src_terminal_Id));
}
public int getSrc_terminal_type()
{
return this.Src_terminal_type;
}
public int getRegistered_Delivery()
{
return this.Registered_Delivery;
}
public int getMsg_Length()
{
return this.Msg_Length;
}
public string getMsg_Content()
{
return Encoding.Default.GetString(this.Msg_Content);
}
public string getLinkID()
{
return Encoding.ASCII.GetString(this.LinkID);
}


}
windowslee 2006-02-24
  • 打赏
  • 举报
回复
BigEndianUnicode
xjjdanran 2006-02-24
  • 打赏
  • 举报
回复
UCS2对应.NET中,究竟是哪个编码方式?
xjjdanran 2006-02-24
  • 打赏
  • 举报
回复
谢谢,我现在做的是移动的,也就那四种编码方式。UCS2对应的值就是8,submit中,对于类型为8的内容,是不是转换成byte[]后再原样复制一遍,然后就以byte[]发送出去?而不是再转换成string,如何转换?
windowslee 2006-02-24
  • 打赏
  • 举报
回复
你看看SUBMIT的部分,反正就是根据协议在Encoding.xxx几种不同的编码间变换一下
我上边给的代码是小灵通的,我们这边小灵通网关给的编码是固定的,所以我就没有管了,呵呵.
xjjdanran 2006-02-24
  • 打赏
  • 举报
回复
windowslee() :
Deliver返回的消息是UCS2编码,Encoding.Default.GetString(this.MsgContent)还是原样
xjjdanran 2006-02-24
  • 打赏
  • 举报
回复
我用的是亚信的API开发包,当手机回复时,如果带中文,返回的编码就是UCS2,显示出来就是乱码
windowslee 2006-02-24
  • 打赏
  • 举报
回复
Deliver:(mo)
public string getMsgContent()
{
return Encoding.Default.GetString(this.MsgContent);
}

Submit:(mt)
public void setMsgContent(string strMsgContent)
{


if (this.MsgFormat==0)
{
byte[] b_MsgContent=Encoding.ASCII.GetBytes(strMsgContent);
this.MsgContent=new byte[b_MsgContent.Length];
Buffer.BlockCopy(b_MsgContent,0,this.MsgContent,0,b_MsgContent.Length);
this.MsgLength=(byte)b_MsgContent.Length;
}
if (this.MsgFormat==8)
{
byte[] b_MsgContent=Encoding.BigEndianUnicode.GetBytes(strMsgContent);
this.MsgContent=new byte[b_MsgContent.Length];
Buffer.BlockCopy(b_MsgContent,0,this.MsgContent,0,b_MsgContent.Length);
this.MsgLength=(byte)b_MsgContent.Length;
}
if (this.MsgFormat==15)
{
byte[] b_MsgContent=Encoding.Default.GetBytes(strMsgContent);
this.MsgContent=new byte[b_MsgContent.Length];
Buffer.BlockCopy(b_MsgContent,0,this.MsgContent,0,b_MsgContent.Length);
this.MsgLength=(byte)b_MsgContent.Length;
}

}
hy98521 2006-02-24
  • 打赏
  • 举报
回复
up 最近我也在做短信。 不过没碰到过你说的事情啊。
xjjdanran 2006-02-24
  • 打赏
  • 举报
回复
最近在做一个短信平台,从运营商处接收到的内容是UCS2编码的
请问在.NET中如何处理?
xjjdanran 2006-02-24
  • 打赏
  • 举报
回复
虽然问题还没解决,感谢windowslee()的帮助!

又开新贴求助:
http://community.csdn.net/Expert/topic/4575/4575305.xml?temp=4.284084E-03
xjjdanran 2006-02-24
  • 打赏
  • 举报
回复
没人说话了?

110,537

社区成员

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

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

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