“测试。”的unicode代码是“6D4B8BD53002”,我利用bMsg(0) = Val("&h6D"),bMsg(1) = Val("&h4B")这样的方法生成字节数组,然后用StrConv(bMsg, vbUnicode)转为字符串是“mK嬚0”,我的问题是现在如何把“mK嬚0”转换为原来的“测试。”

解决方案 »

  1.   

        b2(0) = &H4B
        b2(1) = &H6D
        b2(2) = &HD5
        b2(3) = &H8B
        s = b2
        Print s
      

  2.   

        Dim b() As Byte
        Dim s As String
        b = StrConv("测试", vbFromUnicode)
        Debug.Print Hex(b(0)); Hex(b(1)); Hex(b(2)); Hex(b(3))
        '显示结果是B2E2CAD4
        
        Dim b2(0 To 3) As Byte
        b2(0) = &HB2
        b2(1) = &HE2
        b2(2) = &HCA
        b2(3) = &HD4
        s = StrConv(b2, vbUnicode)
        Print s
      

  3.   

    也许是我说的不清楚。我现在试验的是把“测试。”的unicode代码转为Ascii字节数组,然后用StrConv把该字节数组转为字符串,得到的是“mK嬚0”,那问题来了,如果我现在有个字符串"mK嬚0",我该用什么方法转换,才能得到原来的字符串“测试。”
      

  4.   

    dim b() as byte ' ansi(ascii) byte
    b=strconv("测试",vbfromunicode)如果 字节数组 b 的数据为: mK嬚0
    msgbox strconv(b,vbunicode)
      

  5.   

       抱歉,前几天出差。
       也许是我说的不清楚吧,各位老大还是没明白我的意思,我再说一下。
       我现在测试的是一个手机模块,比如我要发送短信“测试。”给手机的时候,我是把“测”的Unicode编码6D4B转换为Byte数组:b(0)=109,b(1)=75;“试”的Unicode编码8BD5转换为:b(2)=139,b(3)=213;“。”的Unicode编码3002转换为b(4)=48,b(5)=2,这样发送,手机收到正确的“测试。”短信。当用手机发送短信内容为“测试。”给手机模块后,用AT+CMGR取得的短信内容是“mK嬚0”,我用Hex(Ascw("m"))+Hex(Ascw("K"))=6D4B这个结果刚好和“测”的Unicode编码是一样的,但是后面的“嬚0”如果用前面的方法就行不通了;现在就求助各位大侠给个方法,怎么把“mK嬚0”进行解析成真正的内容“测试。”。
      

  6.   

    Public Function ascg(smsg As String) As String Dim si, sb As Integer
     Dim stmp As Integer
     Dim stemp As String sb = Len(smsg)
     ascg = ""
     For si = 1 To sb
      stmp = AscW(Mid(smsg, si, 1))
      If Abs(stmp) < 127 Then
       stemp = "00" & Hex(stmp)
      Else
       stemp = Hex(stmp)
      End If
      ascg = ascg & stemp
     Next si
     ascg = Trim(ascg)
    End Function
      

  7.   

    Public Sub readsms(rnum As String) mobcomm.Output = "AT CMGF=1" vbCr
     mobcomm.Output = "AT CMGR=" & rnum vbCrEnd Sub
      

  8.   

       starair,你好,我用AT+CMGR得到的内容为:+CMGR:"REC UNREAD","1586032xxxx","09/07/17,12 :12 :00",0,4,0,6 mK嬚0,我把“mK嬚0”传入ascg,得到的是“006D004B5B1A0030”,我该如何转换得到汉字字符串?
      

  9.   

    你为什么要把Unicode编码转换为Byte数组?
    不可以直接发送接收Unicode吗?
      

  10.   

    Private Sub Form_Load()
    L1 = AscW("测") 'L1 是测的Unicode 27979
    Debug.Print L1
    L2 = Hex(L1)
    Debug.Print L2 '转为十六进制6D4B
    L3 = Val(&H6D)
    Debug.Print L3 '109
    L4 = Val(&H4B)
    Debug.Print L4 '75
    Dim a(1) As Byte
    a(0) = L3
    a(1) = L4
    L5 = Hex(a(0))
    L6 = Hex(a(1))
    A1 = "&" & "h" & L5 & L6 '&H6D4B
    A1 = Val(A1)
    Debug.Print A1 '27979
    Debug.Print ChrW(A1) '测
    End Sub
      

  11.   

    '将一个字符串通过PostMessage传送出去
    Public Sub subPostString(ByVal strP As String)
        Dim intP As Integer
        Dim intK As Integer
        Dim lngAsc As Long
        Dim lngP As Long
        Dim strT As String
    On Error GoTo errSub
        Debug.Print strP
        For intP = 0 To Len(strP) - 1
            strT = Mid(strP, intP + 1, 1)
            If Asc(strT) <= 0 Then
                lngAsc = AscW(StrConv(strT, 128))
                If lngAsc < 0 Then
                    lngAsc = lngAsc + 65536 '2^16
                End If
            Else
                lngAsc = Asc(strT)
            End If
            lngP = PostMessage(lngHandle, WM_CHAR, lngAsc, 0)
        Next intP
        Exit Sub
    errSub:End Sub这是一个字符串一个一个字符的传送给:lngHandle句柄指定的控件的函数,不知对你有用没有。
      

  12.   

    可以传汉字,传送之前需要将汉字转换为UniCode码,发送其UniCode码。
      

  13.   

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

  14.   

        starair,Veron_04:CDMA 手机模块发送中文短信,直接发送汉字的UniCode码手机接收到的是乱码。
         SYSSZ:我明白你的意思,但是我通过AT+CMGR得到的短信内容是“mK嬚0”,前面2个字符“mK”,转换后得到的是正确的 “测”,后面的“嬚0”按你的方法就没法得到正确的中文了。
      

  15.   

    应该是字节序的问题。
    windows 是 Little-Endian,字符串 "测试。" 为 4B-6D-D5-8B-02-30
    手机大概是 Big-Endian,你收到的实际是 6D-4B-8B-D5-30-02,所以前两个字符是 "mK" 而不是 "Km"——这么明显的区别都没发现!
    所以只要将奇耦字节交换就能得到正确的内容。
      

  16.   

        Tiger_Zhao:你好,我是新手,不大明白,能给个VB函数吗。
         在VB中“测试。”我通过用Hex(Ascw("测"))+Hex(Ascw("试"))+Hex(Ascw("。"))得到的是6D4B-8BD5-3002,可是“mK嬚0”用前面的方法得到的是6D4B-5B1A-30,我该如何得到“6D-4B-8B-D5-30-02”。
      

  17.   

    我想你接收到的数据一定不是Unicode字符,可能是UTF8
      

  18.   

    Option ExplicitPrivate Sub Command1_Click()
        If txtHZ.Text = "" Then Exit Sub
        txtUN.Text = Hex(AscW(txtHZ.Text))
    End SubPrivate Sub Command2_Click()
        txtHZ.Text = CStr(ChrW(Val("&H" & txtUN.Text)))
    End Sub
      

  19.   

        CHRL:我AT+CMGR得到的源串就是“mK嬚0”。
        Veron_04:你的方法好像得不到正确的“测试。”吧。
      

  20.   

    一个一个字符的转换,不要全部上,比如:测 点击UniCode可以得到:6D4B 这就是:“测”的UniCode编码。
      

  21.   

    Hex(Ascw("测")) 得到的 6D4B,实际存储方式(低位在前)为 4B-6Dsub SwapEndian(a() as byte)
        dim i as long, nTmp as byte
        for i=0 to ubound(a) step 2
            nTmp = a(i)
            a(i) = a(i+1)
            a(i+1) = nTmp
        next
    end subdim a() as byte, s as string'发送'
    s = "测试。"
    a = s
    SwapEndian a
    Send a'接收'
    a = Recive()
    SwapEndian a
    s = a
    debug.print s
      

  22.   

        Veron_04:我现在不是“测试。”不能得到UniCode编码哦,而是我用手机发送短信“测试。”给手机模块,然后从手机模块得到的内容是“mK嬚0”,得到内容“mK嬚0”后不知怎么转化为正确的短信内容“测试。”
        Tiger_Zhao:手机模块只能通过AT命令取到短信,但是得到的不是字节数组哦,而是字符串“mK嬚0”
      

  23.   

    字符串“mK嬚0”赋到一个Bype数值,再由SwapEndian转换得到的是"洀??"。
      

  24.   


    6D:就是m的ASC编码,
    4B:就是K的ASC编码,
    但你要这样处理:测:的UniCode代码:6D4B 你需要把它存在两个Byte中,在接收端你需要把这两个字节的内容拿出来组合起来,再求汉字。比如:高字节:6D
    低字节:4B汉字的UniCode码:高字节+低字节    ——》6D4B这是你是用ChrW(6D4B)就可以得到:测 字了。这是对于单一汉字而言,记住:汉字是一个字,两个字节, 而你把它当作一个字节来处理,当然要出错了。
      

  25.   


    6D:就是m的ASC编码,
    4B:就是K的ASC编码,
    但你要这样处理:测:的UniCode代码:6D4B 你需要把它存在两个Byte中,在接收端你需要把这两个字节的内容拿出来组合起来,再求汉字。比如:高字节:6D
    低字节:4B汉字的UniCode码:高字节+低字节    ——》6D4B这是你是用ChrW(6D4B)就可以得到:测 字了。这是对于单一汉字而言,记住:汉字是一个字,两个字节, 而你把它当作一个字节来处理,当然要出错了。
      

  26.   


    6D:就是m的ASC编码,
    4B:就是K的ASC编码,
    但你要这样处理:测:的UniCode代码:6D4B 你需要把它存在两个Byte中,在接收端你需要把这两个字节的内容拿出来组合起来,再求汉字。比如:高字节:6D
    低字节:4B汉字的UniCode码:高字节+低字节    ——》6D4B这是你是用ChrW(6D4B)就可以得到:测 字了。这是对于单一汉字而言,记住:汉字是一个字,两个字节, 而你把它当作一个字节来处理,当然要出错了。
      

  27.   

    AT+CMGR 命令收到的明明是字节数组:http://www.diybl.com/course/4_webprogram/asp.net/netjs/2008223/100491.html
      

  28.   

    汉字“测试” 在内存中是这样存放的:4B 6D D5 8B  (内存中的十六进制数据格式)如果你这样排列 6D 4B 8B D5  将得到  “ mK嬚 ”
      

  29.   

    字符有单字节和双字节之分,单字节字符“ m ”对应 6D  ,“ K ”对应 4B ,
    那么 6D 4B 按照单字节字符编码转换为 mK 
    其没有对应的双字节字符:无显示(控制码?)
    同理:单字节字符 m 对应 6D  , K 对应 4B ,
    那么 4B 6D 按照单字节字符编码转换为 Km 
    其对应的双字节字符是汉字 “测” 字。
      

  30.   

    “测试。”的unicode代码是“6D4B8BD53002”,利用
    bMsg(0) = Val("&h4B"),测
    bMsg(1) = Val("&h6D")bMsg(2) = Val("&hD5"),试
    bMsg(3) = Val("&h8B")
    bMsg(4) = Val("&h02"),。句号
    bMsg(5) = Val("&h30")
    这样的方法(每个汉字或标点符号都要采用低位在前,高位在后的方式)生成字节数组,
    然后用StrConv(bMsg, vbUnicode)转为字符串是 “测试。”
    学习了。
      

  31.   

    1、测试的unicode码是"6D4B8BD5",不是“6D4B8BD53002”。2、处理转换问题:'在vb为得到测试的Unicode码这样做:
    Dim ucode() As Byte
    ucode = "测试"
    '观察结果
    Dim i As Integer
    For i = 0 To UBound(ucode)
        Debug.Print ucode(i)
    Next i
    ' 75 即4B
    ' 109  6D
    ' 213  D5
    ' 139  8B
    '从unicode转成汉码可以这样做
    Dim chin As String
    chin = ucode'观察结果
    Debug.Print chin'测试看懂了以上程序,汉字Unicode处理并不难吧!!
      

  32.   

    另外手机短信大都是PDU编码格式,先去网上看看PDU编码吧.
      

  33.   


    这本身用的就是vbUnicode编码,bMsg是字节数组,无须转换,直接显示:debug.print bMsg'结果为:测试。另外:用Val多此一举,直接来:Dim S(5) As Byte
    S(0) = &H4B
    S(1) = &H6D
    S(2) = &HD5
    S(3) = &H8B
    S(4) = &H02
    S(5) = &H30
    Debug.Print S'vbUnicode编码6D4B8BD53002用字节数组直接显示为汉字:测试。楼主动应该查一查你和对方手机的编码格式,确认一下是不是PDU,28楼老鸟给的地址那是西门子手机用的。
      

  34.   


    问题出在哪里呢?从手机模块发送的信息是双字节字符,6个字节的信息,发到手机后手机能够正确识别出汉字来,手机的接收是没有问题的。再仔细仔细看看你说“用前面的方法得到的是6D4B-5B1A-30,我该如何得到“6D-4B-8B-D5-30-02”。为什么这里你的手机模块就收到5个字节啊?再看收到的这个字符:“ mK嬚0 ”仔细看的话,少了个笔画,现在先不去管它是怎么造成的,看看现在这个古怪字的十六进制编码应该是这样的:  00 6D  00 4B  5B 1A  00 30 (这里一些字符的高位是0就无意义了,,于是就变成了:
         6D      4B  5B 1A     30现在先将其原来应该有的0 加上去,再排列成内存格式应该是这样的: 6D 00 4B 00 1A 5B 30 00上面的内存排列格式经过转换就得到一个双字节的字符“ mK嬚0 ”其实能够得到这个字符就可以了,有了它经过简单处理就能够得到“测试”这2个汉字了。接着反串(?!)双字节的字符]“ mK嬚0 ”的 单字节字符编码,看可以得到这个楼主发出去的原件:
    6D 4B 8B D5 30 ,这里已经掉了一条腿,就是最后一个字节 20 没了,不过无所谓,因为这个鬼怪字的最后是个0,对应的单字节字符串就是30,没有就没了吧。下面是最后一步,将6D 4B 8B D5 30 按照内存排列方式进行排列,就会得到正确的结果:4B 6D D5 8B 00 30  “测试”其实有个很方便的方法可防止“乱码”,并且无需转换,例如
       Dim mybyte() As Byte
       emybyte="测试"              ’这样写字符串到数据组,就别担心数据转换的麻烦了
       Text1 = StrConv(mybyte, 8)  ,这里可以是8 想睡觉了。
      

  35.   


    感谢东方之珠指导!    近来没事做,就窝家了,呵呵,随便学习点知识。   刚刚试下,果然不用哪个 Val 一样可以,真是多此一举了。 哦,上面还多了个 e 哦,又不好运行了。呵呵
      

  36.   

    又发现多用了个函数 StrConv()没他照样运行我是不是好马虎啊都红脸了。总共3句代码,多打了一个字母 e 变量就变了,会报错的。还多用了个函数 StrConv()真是马虎到家了郁闷哦为什么我就不好更改下呢?
      

  37.   

    这几天一直在努力。
    我不是看上楼主的分数,这个帖子我一分都不要。学习VB已经几个月了,一直没有老师指导,遇到困难有时候还真是很难解决,这个帖子让我学到了好多,如乱码啦,内存数据排列,单字节与双字节编码等等好几天都没看到楼主了哦
    用AT+CMGR得到的内容为:+CMGR:"REC UNREAD","1586032xxxx","09/07/17,12 :12 :00",0,4,0,6 mK嬚0,我把“mK嬚0”传入ascg,得到的是“006D004B5B1A0030”,我该如何转换得到汉字字符串? 
    “006D004B5B1A0030”是“mK嬚0”的什么编码啊?郁闷!这个问题让我一直在想
    1
    可以肯定的是这个编码是双字节字符数据
    2
    006D在前就一定没有根据内存格式排列,所以结果肯定是要互换位置
    3
    006D 004B 是一个汉字的话,那么后面的5B1A0030 又该这么安排?头都大了。
    4
    如果不是双字节字符的话,就应该把00给去掉!对了,试试看!
    5
    去掉后得到6D 4B 1A 5B 30 哈哈,刚好5个字符!对应5个编码。
    6
    上一步是在英文1个字节,汉字2个字节,标点1个字节的基础上并且清除了无效0后,得出的结论。
    7
    因为有0 的存在,已经可以肯定这个编码是按照双字节字符发送/接收的。那么关键点就是1A5B了
    8
    转换1A5B为二进制是0101101100011010,中文拆分为11000101 10101100 10011010  C5 AC 9A
    9
    多余拆分了,又不是要读写文件编码方面先行放弃。
    10
    这个1A 5B 的位置如果是中文的话应该是“测试”的“试”字!对了,对照这个字的编码是应该 8B D5  
    11
    如何将这个1A5B 转换为 8BD5 ?其内在的联系是什么?如何得到这个位置的8B D5 ?思考中
    12
     这个位置的“试”字怎么会变成了“嬚”字?对了,查“试”的编码信息与“嬚”的信息有无联系!
    13
    “试”字:十六进制:CA D4  ; ASCII:-13612 ; Unicode:51924 (CA  D4)
    14
    “嬚”字:十六进制: 8B D5  ; ASCII:-29739 ; Unicode:35797 (8B  D5)
    15
    哈哈,张冠李戴啊,忍不住激动类这个 8B 5D 浮出水面来了
    16
    重新开始,丢掉所有上面的步骤,从字符串方面再次进入!取字符串 “mK嬚0”编码信息! 
    17
    早就知道的是“mK嬚0”的双字节字符编码,下面用单字节字符方式取其编码。
    18
    “mK嬚0”单字节字符串:
    十六进制:6D  4B  8BD5  30 
    ASCII:   -29739  
    Unicode: 109 (6D)     75 (4B)    35797(8BD5)    48 (30)
    19
    “测试。”单字节字符串:
    不值得再试
    20
    结果:    单字节字符串“mK嬚0”的编码   6D  4B  8BD5  30 
                      经内存格式排列后得到  4B 6D D5 8B 30
              双字节字符串“测试。”的编码  4B 6D D5 8B 02 30
      

  38.   

    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private Sub Form_Load()
        Dim buf() As Byte
        Dim i As Long, a As Long    a = LenB(StrConv("mK嬚0", 128))
        
        ReDim buf(1 To a)
        Call CopyMemory(buf(1), ByVal "mK嬚0", a)
        
        For i = 1 To a
            Debug.Print Hex$(buf(i))
        Next
    End Sub
    '将 "mK嬚0" 6D 4B 1A 5B 30 转换到“测试” 6D 4B 8B D5 30
    要显示“测试”不要再说了吧。
      

  39.   

    Private Sub Form_Load()
        Dim buf() As Byte
        buf = StrConv("mK嬚0", 128)
        Debug.Print Hex$(buf(3))
        '这样转换也行
    End Sub
      

  40.   

       多谢大侠的解释。
        我当时没搞懂单/双字节编码的关系,后来换了个AnyData芯片的手机模块,就没这个问题了;这几天为了赶交这个功能,一直没时间上论坛,周1我再用原来的WaveCOM芯片试试,结果出来后再给大家分。