试试:Strconv先转为Ansi,然后转为Unicode,要用LocalID参数(简体中文的LocalID)
解决方案 »
- 使用GDI+绘图时候发生的文图,图像只画了一部份,请教一下大家
- vb6.0进度条问题
- 请问一个有关access控件的问题
- Data1.RecordSource = "select * from ruzhang where ruzhang.MONTH like ""Combo2.Text""order by HH"
- 显示为 .016 实际要显示为 0.016
- 怎么去掉字符串中间的空格
- 如何获得本地网卡在注册表里的NetworkAddress这个键值?
- 使用ADODC控件如何增加,修改,删除数据?
- 怎样县之窗体的最小大小
- 请问现在在上海想找一个会VB程序开发,1-2年工作经验,一个人的工资应该是多少?
- 请问如何把数据源导入到datagrid。请给一个例子。谢谢
- 有关ADO删除记录
字符串是我直接从邮箱得到的,对于ANSI和UNICODE的转换,VB早已在此之前比我先先下手了,短信息的编码方法及编程实现
下面我们介绍纯英文和纯中文的信息编码方法。通过测试我们发现,每条发送的短信息前面部分均相同,只是被叫号码和短信息内容有变化。
1.英文编码
参见表2,设短信息内容为“Hello World!”。缺省的GSM 字符集为7位编码,可以简单地理解为ASCII码(ASCII值小于80Hex,因此,Bit8被忽略),依次将下一7位编码的后几位逐次移至前面,形成新的8位编码,参见表2箭头指示。需要注意的是第9行,移位计数已达7位,则直接将本编码前加0。GSM并非支持所有的ASCII字符显示。
下面是实现英文编码的部分Delphi 5代码:
//英文格式编码,s为String
function Encode1(var s:String):String;
var
i,j,len:Integer;
cur:Integer;
t:String;
begin
Result:=‘’;
len:=Length(s);
//j 用于移位计数
i:=1;j:=0;
while i<=len do
begin
if i<len then
//数据变换
cur:=(ord(s[i]) shr j) or ((ord(s[i+1]) shl (7-j)) and $ff)
else
cur:=(ord(s[i]) shr j) and $7f;
FmtStr(t,‘%2.2X’,[cur]);
Result:=Result+t;
inc(i);
//移位计数达到7位的特别处理
j:=(j+1) mod 7;if j=0 then inc(i);
end;
end;
2.中文编码
参见表3,设短信息内容为“中文短信息”。中文短信息的实现较简单,只需将GB2312的中文编码转换为代码页为CP936的Unicode编码即可。
通过Delphi的WideString类型转换,可以巧妙地实现GB2312到Unicode的编码转换(注意代码页和操作系统相关联)。下面是实现中文编码的部分Delphi 5代码:
// 中文格式编码,s为Unicode String
function Encode2(var s:WideString):String;
var
i,len:Integer;
cur:Integer;
t:String;
begin
Result:=‘’;
len:=Length(s);
i:=1;
while i<=len do
begin
cur:=ord(s[i]);
//BCD转换
FmtStr(t,‘%4.4X’,[cur]);
Result:=Result+t;
inc(i);
end;
end;
小 结
以上介绍了PDU格式的短信息编码。建议英文信息长度不超过140个字符,中文信息不要超过54个汉字。如果使用能够支持文本方式的手机进行发送,实现起来更简单。如发送“Hello World!”,用如下的AT指令即可:
AT+CGMF=1AT+CGMS=“13605696031”,129
>Hello World!<^Z>
以上是我在网上搜到的资料,我的DELPHI学得太臭,谁帮我翻译出来,立马送分!!!
function Encode1(s As String) As String;
Dim i As Integer
Dim j As Integer
Dim vblen as Integer;
Dim cur AS Integer;
Dim t AS String;
Result=""
vblen=Leng(s)
'j 用于移位计数
i=1: j=0
while i< =len do
if i< len then
'数据变换
cur=(ord(s(i)) shr j) or ((ord(s(i+1)) shl (7-j)) and &Hff)
else
cur=(ord(s(i)) shr j) and &H7f
t=Format(cur,‘%2.2X’)
Result=Result+t
inc(i)
'移位计数达到7位的特别处理
j=(j+1) mod 7
if j=0 then inc(i)
Wend
End Function
利用 lstrlen 计算中英文混合字串的长度
在 32-bit 版本的 VB 底下, 将每一个字符都视为两个 Byte, 所以
Len("中英Mixed") 等于 7
LenB("中英Mixed") 等于 14
但是在很多场合底下, 我们希望中文字长度以 2 计算, 英文字母长度以 1 计算, 此时使用的方法如下:
' 欲计算字串 S 的长度
N = 0
For I = 1 To Len(S)
C = Asc(Mid(S, I, 1)) ' 取得第 I 个字符组的字符码
If C >= 0 And C <128 Then ' 英文
N = N + 1
Else ' 中文
N = N + 2
End If
Next
看起来程序有点罗唆, 如果您不喜欢这个方法, 可以使用 Windows API 的 lstrlen 函数, 假设假计算 S 的长度, 则 API 声明式如下:
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
而调用的叙述则是:
n = lstrlen("中英Mixed" + Chr(0))
Print n ' n 将等于 9
请注意调用 lstrlen 时必须加上 Chr(0), 因为此一函数是根据 Chr(0) 来判断字串的结束。
调用 lstrlen 除了程序比较简短之外, 速度也比我们写 VB 程序判断中英文字然后计算长度来的快。
利用 StrConv 计算中英文混合字串的长度
上一周说明利用 Windows API 的 lstrlen 计算中英文混合字串的长度之后,台中的 Rose 读者来函, 说还有更简单的计算方法, 如下:
LenB(StrConv("中英Mixed", vbFromUnicode))
说真的, 因为笔者懂得调用 Windows API, 所以竟然忽略了此一 VB 内建的函数,可见闻道有先后, 在此笔者亦希望先闻道的读者能够将您的心得发表出来, 与喜欢 VB 的读者交流。
StrConv 的作用是字串内容的转换, 其中将叁数二设定成 vbFromUnicode,作用是把「双位元」的字串转换成中文字占用 2 Bytes、英文占用 1 Bytes 的字串,所以紧接着调用 LenB, 便可以计算出中英文混合字串的长度。
如何传递不固定个数的叁数?
定义副程序时, 我们必须把叁数一一列出来, 例如:
Sub MySub( P1, P2, ┅)
但如果我们将来调用副程序时, 可能会传入不固定个数的叁数, 那么副程序该如何定义呢?答案如下:
Sub MySub( ParamArray P() ) ' 把叁数 P 定义成一个阵列
如此定义副程序之后, 以下都是将来可能出现的调用叙述:
MySub "ABC" ' 只传递一个叁数
MySub 1, 3, 9, 988, 776, 234 ' 传递 6 个整数叁数
MySub 123, "abc", Date() ' 传递 3 个不同型别的叁数
以最后一个调用叙述为例, P(0) 叁数将等于 123, P(1) 叁数等于 "abc", P(2) 叁数则等于 Date() 函数的传回值, 而由于 P() 是一个阵列, 我们可以利用以下方法读取每一个叁数:
For i = 0 To UBound(P)
' P(i) 等于第 i 个叁数
Next
最后, 请注意以 ParamArray 所定义的叁数一定是 Variant(不定型) 型别, 若要判断每一个个别叁数的资料型别, 可以使用 TypeName 函数。
字串中文的问题字串中文的问题,起於vb的字串是使用UniCode,而我们一般是使用Ascii Code。
这差别在何处呢?UniCode的每个字元长度是2个byte,而Ascii是一个byte,如果
说,我将们将VB的字串写入档案,有时会有意想不到的结果。例如:
Text1.Text = "这是一个abc"
len5 = Len(str5)
如果我们的Access资料库有一栏位的长度是10个Byte,所以我们在TextBox中设定
MaxLength = 10,但是上面的例子得到的len5是7,而不是我们认为的11,因为不管
是中文或英文,vb一律以UniCode来存,所以str5的长度是7个"字元",而text1最大
的长度限制是10,7没有超过10,故使用者仍可输入,但存档时,11个byte超过10个
byte,所以会有错。可是或许有人发现,使用RS232来传资料时,另一端主机是Ascii编码的机器,在vb中
我们若使用String来传,一样可以通啊,其实那是vb在传送与接收data时,会做转换
,使我们的程式设计较方便,但如果传的资料是Binary时,就头大啦。例如说,以字
串的方式来传送资料,当想传Ascii 大於128时,常有些问题,因为ASC(Chr(129))=0
,使我们不能用Chr()的指令来放资料。(事实上,您可以使用ChrW(129)来存资料,
和使用AscW()来取得值,加个W代表是Word的运算),这时候,就只有使用Byte Array
来做了。1.UniCode转成ByteAry
Dim byteAry() As Byte
Dim str5 As String
Dim i As Long
str5 = "这abc"
byteAry = str5
For i = LBound(byteAry) To UBound(byteAry)
Debug.Print byteAry(i) '得 25 144 97 0 98 0 99 0
Next i
Debug.Print Len(str5), LenB(str5) '得4 8 所以了,可看出UniCode 的特性,程式应改一下,使用Strconv()来转换 Dim byteAry() As Byte
Dim str5 As String
Dim i As Long
str5 = "这abc"
byteAry = StrConv(str5, vbFromUnicode)
For i = LBound(byteAry) To UBound(byteAry)
Debug.Print byteAry(i) '得 25 144 97 98 99
Next i
Debug.Print LenB(StrConv(str5, vbFromUnicode)) '得52.ByteAry转回UniCode 使用Strconv()转换
Dim byteAry(10) as Byte
Dim Str5 as String
byteAry(0) = 25
byteAry(1) = 144
byteAry(2) = 97
byteAry(3) = 98
byteAry(4) = 99
Str5 = StrConv(byteAry, vbUniCode)
谢谢fanpingli(小软):
也请你到一下页面跟贴,我一定给你分(至少300分)!!!
还有个地方你可以去领分!http://www.csdn.net/expert/topic/542/542378.xml
gb2312与unicode编码转换的问题了!!!继续期待
gb2312与unicode编码转换的问题了!!!继续期待
up!up!up!!
真好学!!!
一些有用的函式
SubStr() 中文化取子字串,相对Mid()
Strlen() 中文化字串长度,相对Len()
StrLeft() 中文化取左字串,相对Left()
StrRight() 中文化取右字串,相对Right()
isChinese() Check某个字是否中文字Public Function SubStr(ByVal tstr As String, start As Integer, Optional leng As Variant) As String
Dim tmpstr As String
If IsMissing(leng) Then
tmpstr = StrConv(MidB(StrConv(tstr, vbFromUnicode), start), vbUnicode)
Else
tmpstr = StrConv(MidB(StrConv(tstr, vbFromUnicode), start, leng), vbUnicode)
End If
SubStr = tmpstr
End FunctionPublic Function Strlen(ByVal tstr As String) As Integer
Strlen = LenB(StrConv(tstr, vbFromUnicode))
End FunctionPublic Function StrLeft(ByVal str5 As String, ByVal len5 As Long) As String
Dim tmpstr As String
tmpstr = StrConv(str5, vbFromUnicode)
tmpstr = LeftB(tmpstr, len5)
StrLeft = StrConv(tmpstr, vbUnicode)
End FunctionPublic Function StrRight(ByVal str5 As String, ByVal len5 As Long) As String
Dim tmpstr As String
tmpstr = StrConv(str5, vbFromUnicode)
tmpstr = RightB(tmpstr, len5)
StrLeft = StrConv(tmpstr, vbUnicode)
End FunctionPublic Function isChinese(ByVal asciiv As Integer) As Boolean
If Len(Hex$(asciiv)) > 2 Then
isChinese = True
Else
isChinese = False
End If
End Function
UP有理!!!
UP有理!!!
UP有理!!!
UP有理!!!
UP有理!!!
UP有理!!!
UP有理!!!
http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/GB/GB2312.TXT
在ASP里set mailobj=server.CreateObject("CDONTS.NEWMAIL")
mailobj.Send的第一个参数,也就是邮件的主题,不能用中文。头痛啊!!
关注!!
因为小软虽然热情高涨但没有说到点子上!!!