查看: 6938|回复: 1
打印 上一主题 下一主题

CDMA短信二次开发将uniCode转化为中文的...

[复制链接]
跳转到指定楼层
楼主
发表于 2014-2-28 16:33:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
利用短信CDMA短信收发设备通过AT指令进行二次开发,国内大多需要发送的都是中文,而短信收发设备也不能直接识别中文,只有通过uniCode才能识别。所以我们发送一条正常的中文短信,就需要把短信的内容,从中文转化为uniCode码,在从uniCode转回中文,才能展示在屏幕上给我们看。
下面就给大家一个uniCode和中文相互转换的代码大家参考:

以下是将uniCode转换为中文的代码。
function TfrmMain.ReadHex(AString: string): integer;
begin
Result:=StrToInt('$'+AString)
end;

function TfrmMain.UnicodeToAnsi(Unicode: string): string;
var
s:string;
i:integer;
j,k:string[2];
begin
i:=1;
s:='';
while i j:=Copy(Unicode,i+2,2);
k:=Copy(Unicode,i,2);
i:=i+4;
s:=s+Char(ReadHex(j))+Char(ReadHex(k));
end;
if s<>'' then
s:=WideCharToString(PWideChar(s+#0#0#0#0))
else
s:='';
Result:=s;
end;


VB实现中文转换成unicode编码例子:


A.发送中文例子:
发送中文有两种方法,一种是PDU,一种是UCS2文本
1.PDU方法:
at+cmgf=0
at+cmgs=24
>0891683108100005F011000B813109018759F10008A70A00650073007496484E30
信息内容为set陈丰
解释:此字符串传set陈丰五个字符,采用unicode编码。
0891固定格式不动,683108100005F0为短消息中心号码,
11固定格式不动代表PDU格式,
00代表是第几条短消息,
0B81固定格式不动,3109018759F1为目的号码,
00固定格式不动代表是短消息,
08代表8位unicode编码(中文必须用unicode编码),F0到F3为7编码,F4到F7为8位编码
A7代表此短消息在短消息中心存储的时间是24小时,最大FF为135周,
0A代表后有10个字节(有1个字节为01,2个为01,类推)
0065是s的unicode编码,0073是e的unicode编码,0074是t的unicode编码,
9648是陈的unicode编码,4E30是丰的unicode编码

0A后跟的就是所需发送的消息部分,全部采用unicode的编码。
unicode的编码转换可调用VB或VC中的函数直接得到。
at+cmgs=24中的24是14再加上消息长度10得出的.

2.USC2的文本方法
at+cmgf=1
at+csmp=??,??,??,8(问号代表自己根据需要选择合适的参数)
at+cmgs=手机号码(1390PQRABCD)
>00650073007496484E30
信息内容为set陈丰
当您用UCS2文本发送中文短消息时,要先将中文转成unicode编码,
再将中文短消息的unicode编码用文本方式发送.


B.编程例子:
Private Sub Command1_Click()
' 使用 COM3。

' 9600 波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.Settings = "9600,N,8,1"
MSComm1.Handshaking = comRTS

' 打开端口。
' MSComm1.PortOpen = False
' MSComm1.PortOpen = True
' 将 at 命令送到调制解调器。
MSComm1.Output = "AT"
MSComm1.Output = Chr(13)
MSComm1.Output = "AT+CMGF=1"
MSComm1.Output = Chr(13)
MSComm1.Output = "AT+CMGS="
MSComm1.Output = Chr(34)
MSComm1.Output = "13901237885"
MSComm1.Output = Chr(34)
MSComm1.Output = Chr(13)
MSComm1.Output = "test OK "
MSComm1.Output = Chr(26)
End Sub

Private Sub Command3_Click()
MSComm1.CommPort = 2
MSComm1.PortOpen = True
End Sub

//将UNICODE转换中文
Public Function Unicode2AscII(ByVal s As String)
On Error Resume Next
Dim i As Integer
Dim r As String
For i = 1 To Len(s) Step 4
r = r + ChrB("&H" & Mid(s, i + 2, 2)) & ChrB("&H" & Mid(s, i, 2))
Next
Unicode2AscII = r
End Function

//将中文转换为UniCode,
function AnsiToUnicode(Ansi: string):string;
var
s:string;
i:integer;
j,k:string[2];
a:array [1..1000] of char;
begin
s:='';
StringToWideChar(Ansi,@(a[1]),500);
i:=1;
while ((a<>#0) or (a[i+1]<>#0)) do begin
j:=IntToHex(Integer(a),2);
k:=IntToHex(Integer(a[i+1]),2);
s:=s+k+j;
i:=i+2;
end;
Result:=s;
end;

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
沙发
发表于 2014-3-2 15:47:07 | 只看该作者
嗯,谢谢,不错的转换代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|未来时代科技 ( 粤ICP备12044031号-1

GMT+8, 2024-4-27 04:18 , Processed in 0.062676 second(s), 30 queries .

Powered by WLSD X3.1

© 2013-2014 WLSD Inc.

快速回复 返回顶部 返回列表
 
【电话】(15118131494)
【QQ】 未来时代科技01 售前咨询
【QQ】 未来时代科技02 售后技术
【旺旺】 请问有什么可以帮到您?不在线可留言.
【邮箱】
inextera@sina.com
【地址】 (深圳市龙岗坂田扬马小区)