高手。。。UCS2编码 转换成ASCII,,,,,急。。。。(300分)

  • 主题发起人 主题发起人 pardboy
  • 开始时间 开始时间
P

pardboy

Unregistered / Unconfirmed
GUEST, unregistred user!
正开发一短信程序,遇到这疑难问题,接收到的恢复短信的内容不正确。
经移动网管指点,接收到的是UCS2码,需转换成ASCII才可正确显示。
急需。。。??
各路神通快快帮忙。。
 
接收到的字符如果包含中文确实使用ucs2编码,但是转换相当容易。请看下列程序片断:
if (dcs and $0c) = $08 then //判断接收到的短消息是否使用ucs2编码。
begin
for i:=1 to round(length(body)/4) do
begin
s:=copy(body,(i-1)*4+1,4);
d:=Widechar(strToInt('$'+s)); //此处是重点,用delphi提供的widechar可以转换
smsbody:=smsbody+d;
end;
res.body:=smsbody;
end;
 
Zero_Cool..,很感激你能回答我的问题。。
但还有些疑问? dcs 是什么啊??
 
把UCS2字符串赋给和个WideString就可以了啊

dw:DWord;
ws:WideString;

for i:=1 to (ucs2 div 4) do
ws:=ws+Dword(Copy(ucs2,i*4-3,4));

showMessage(ws);
 
"接收到的是UCS2码,需转换成ASCII才可正确显示"?
说得不对吧,好象需要把UCS2码转换成GBK码,是吗?
 
提醒你注意事项:因为手机上的UNICODE数据高低字节是互换的,所以你必须在转换前或转换后额外地互换高低字节
下面有MO转换函数,请参数:
int CXXXXXX::ProcessMo(int& nDcs, LPSTR srcBuff, int srclen, LPSTR objBuff, int& objlen)
{
switch(nDcs)
{
case 4://binary
if(srclen>0 && srcBuff[0] == '+')
{
strncpy(objBuff, srcBuff, srclen);
nDcs = 0;
objlen = srclen;
}
else
{
objlen = 0;
}
break;
case 8://unicode
if(srclen>0 && srcBuff[0] == '+')//stk card
{
char *start = strstr(srcBuff, " ");
if(!start || start<srcBuff || start>=srcBuff+srclen) {objlen = 0; return 0;}//error

strncpy(objBuff, srcBuff, start-srcBuff);
objBuff[start-srcBuff] = 0;
PWSTR pStart = (PWSTR)(start+1);
for(UINT loop=0; loop<wcslen(pStart); loop++,pStart++)
{
char * p = (char*)pStart;
char c = p[0];
p[0] = p[1];
p[1] = c;
}
int mlen = WideCharToMultiByte(CP_ACP,0,pStart,-1,NULL,0,NULL,NULL);
char *pStr= (char *)malloc(mlen);
WideCharToMultiByte(CP_ACP, 0, pStart, -1, pStr, mlen, NULL, NULL);
pStr[mlen] = 0;
strcat(objBuff, " ");
strcat(objBuff, pStr);
//objlen = start-srcBuff+mlen+1;
free(pStr);
}
else//normal ucs2
{
for(int loop=0; loop<srclen; loop++)//注意,这里高低字节互换
{
char c = srcBuff[loop];
srcBuff[loop] = srcBuff[loop+1];
srcBuff[++loop] = c;
}

int objlen = WideCharToMultiByte(CP_ACP,0, (PWSTR)srcBuff,-1,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP, 0, (PWSTR)srcBuff, -1, objBuff, objlen, NULL, NULL);
}
objlen = strlen(objBuff);
nDcs = 15;
break;
default:
strncpy(objBuff, srcBuff, srclen);
objlen = srclen;
break;
}
return 0;
}

 
多人接受答案了。
 
我有移动的协议和端口,但我是新手,不知从何处入手?请高手多多指教。
 
后退
顶部