试试:Strconv先转为Ansi,然后转为Unicode,要用LocalID参数(简体中文的LocalID)

解决方案 »

  1.   

    upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
      

  2.   

    巴顿,不是那个问题,是简体中文GB2312编码UNICODE编码转换的问题,
    字符串是我直接从邮箱得到的,对于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学得太臭,谁帮我翻译出来,立马送分!!!
      

  3.   

    我试了一个,很多函数不知,你找找其他人!!
    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
      

  4.   

    我找来的一些文章:
    利用 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 函数。
     
      

  5.   

    又找到一些:
    字串中文的问题字串中文的问题,起於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)
      

  6.   


    谢谢fanpingli(小软):
    也请你到一下页面跟贴,我一定给你分(至少300分)!!!
      

  7.   

    不,至少600分!!!
    还有个地方你可以去领分!http://www.csdn.net/expert/topic/542/542378.xml
      

  8.   

    虽然你们都没回答正确,但我还是要感谢你们,我现在的问题就演变成
    gb2312与unicode编码转换的问题了!!!继续期待
      

  9.   

    虽然你们都没回答正确,但我还是要感谢你们,我现在的问题就演变成
    gb2312与unicode编码转换的问题了!!!继续期待
      

  10.   

    up就给分??
    up!up!up!!
      

  11.   

    对!!给fanpinli加分
    真好学!!!
      

  12.   

    还有一些:
    一些有用的函式
    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
      

  13.   

    UP有理!!!
    UP有理!!!
    UP有理!!!
    UP有理!!!
    UP有理!!!
    UP有理!!!
    UP有理!!!
    UP有理!!!
      

  14.   

    http://www-106.ibm.com/developerworks/library/u-china.html
      

  15.   

    http://www-106.ibm.com/developerworks/library/u-china.html
      

  16.   

    GB2312-80 to Unicode table :
    http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/GB/GB2312.TXT
      

  17.   

    这问题没研究过,不过想到当初一个为解决的问题:
    在ASP里set mailobj=server.CreateObject("CDONTS.NEWMAIL")
    mailobj.Send的第一个参数,也就是邮件的主题,不能用中文。头痛啊!!
    关注!!
      

  18.   

    fanpingli(小软) 原来是位女同志呀,再给1分的优等性别政府特殊津贴!!!
      

  19.   

    感谢 gpo2002(苦思冥想) 的好去处,多少有得到了一些好的东西,现在决定从小软:fanpingli(小软) 那里扣除300分给你!!!
    因为小软虽然热情高涨但没有说到点子上!!!