技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 434|回复: 1
收起左侧

【VB6】不借助API将UTF-8编码的字符串解码为VB6能识别的字符串

[复制链接]

995

主题

2213

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
197
威望
261 点
宅币
16512 个
贡献
32869 次
宅之契约
0 份
在线时间
1574 小时
注册时间
2014-1-26
发表于 2017-11-23 10:50:47 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
[Visual Basic] 纯文本查看 复制代码
Private Function utf8toString(utf8byte() As Byte) As String
Dim I&
Dim charcode As Long
Dim cb As Long
cb = UBound(utf8byte) + 1

Do While I < cb
    If (utf8byte(I) And &HFE) = &HFC& Then '1111110x
        If I + 6 <= cb Then
            charcode = _
                ((utf8byte(I + 0) And &H1&) * &H40000000) Or _
                ((utf8byte(I + 1) And &H3F&) * &H1000000) Or _
                ((utf8byte(I + 2) And &H3F&) * &H40000) Or _
                ((utf8byte(I + 3) And &H3F&) * &H1000&) Or _
                ((utf8byte(I + 4) And &H3F&) * &H40&) Or _
                ((utf8byte(I + 5) And &H3F&))
            I = I + 6
        Else
            Exit Do
        End If
    ElseIf (utf8byte(I) And &HFC) = &HF8& Then '111110xx
        If I + 5 <= cb Then
            charcode = _
                ((utf8byte(I + 0) And &H3&) * &H1000000) Or _
                ((utf8byte(I + 1) And &H3F&) * &H40000) Or _
                ((utf8byte(I + 2) And &H3F&) * &H1000&) Or _
                ((utf8byte(I + 3) And &H3F&) * &H40&) Or _
                ((utf8byte(I + 4) And &H3F&))
            I = I + 5
        Else
            Exit Do
        End If
    ElseIf (utf8byte(I) And &HF8) = &HF0& Then '11110xxx
        If I + 4 <= cb Then
            charcode = _
                ((utf8byte(I + 0) And &H7&) * &H40000) Or _
                ((utf8byte(I + 1) And &H3F&) * &H1000&) Or _
                ((utf8byte(I + 2) And &H3F&) * &H40&) Or _
                ((utf8byte(I + 3) And &H3F&))
            I = I + 4
        Else
            Exit Do
        End If
    ElseIf (utf8byte(I) And &HF0) = &HE0& Then '1110xxxx
        If I + 3 <= cb Then
            charcode = _
                ((utf8byte(I + 0) And &HF&) * &H1000&) Or _
                ((utf8byte(I + 1) And &H3F&) * &H40&) Or _
                ((utf8byte(I + 2) And &H3F&))
            I = I + 3
        Else
            Exit Do
        End If
    ElseIf (utf8byte(I) And &HE0) = &HC0& Then '110xxxxx
        If I + 2 <= cb Then
            charcode = _
                ((utf8byte(I + 0) And &H1F&) * &H40&) Or _
                ((utf8byte(I + 1) And &H3F&))
            I = I + 2
        Else
            Exit Do
        End If
    ElseIf (utf8byte(I) And &HC0) = &H80& Then '10xxxxxx
        '遇到高2位是10的字符,这是不应该出现的。
        Exit Do
    ElseIf (utf8byte(I) And &H80) = &H0& Then  '&Hxxxxxx
        charcode = utf8byte(I) And &H7F
        I = I + 1
    Else
        Exit Do
    End If
    utf8toString = utf8toString & ChrW(charcode)
Loop
End Function

1

主题

5

帖子

17

积分

用户组: 初·技术宅

UID
3035
精华
0
威望
1 点
宅币
10 个
贡献
0 次
宅之契约
0 份
在线时间
1 小时
注册时间
2017-11-2
发表于 2017-11-23 16:10:11 | 显示全部楼层
  拜模已经不足以对你的表达了

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-10-21 07:32 , Processed in 0.092302 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表