Utf8.bas
上传用户:davilee3
上传日期:2015-04-22
资源大小:986k
文件大小:8k
源码类别:

浏览器

开发平台:

Visual Basic

  1. Attribute VB_Name = "mUtf8"
  2. '---------------------------------------------------------------------------------------
  3. ' Module    : mUdf8
  4. ' DateTime  : 2005-5-10 18:25
  5. ' Author    : Lingll
  6. ' Purpose   : utf8 to gb
  7. '---------------------------------------------------------------------------------------
  8. Option Explicit
  9. Public Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
  10. Public Const CP_UTF8 = 65001
  11. Public Function UTF8_Decode(bUTF8() As Byte) As String
  12.     Dim lRet As Long
  13.     Dim lLen As Long
  14.     Dim lBufferSize As Long
  15.     Dim sBuffer As String
  16.     Dim bBuffer() As Byte
  17.     
  18.     lLen = UBound(bUTF8) + 1
  19.     
  20.     If lLen = 0 Then Exit Function
  21.     
  22.     lBufferSize = lLen * 2
  23.     
  24.     sBuffer = String$(lBufferSize, Chr(0))
  25.     
  26.     lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(bUTF8(0)), lLen, StrPtr(sBuffer), lBufferSize)
  27.     
  28.     If lRet <> 0 Then
  29.         sBuffer = Left(sBuffer, lRet)
  30.     End If
  31.     
  32.     UTF8_Decode = sBuffer
  33. End Function
  34. '
  35. 'Option Explicit
  36. '
  37. 'Public Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long
  38. 'Public Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
  39. 'Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
  40. '
  41. 'Public Const CP_UTF8 = 65001
  42. '
  43. ''Purpose:Convert Utf8 to Unicode
  44. 'Public Function UTF8_Decode(ByVal sUTF8 As String) As String
  45. '
  46. '   Dim lngUtf8Size      As Long
  47. '   Dim strBuffer        As String
  48. '   Dim lngBufferSize    As Long
  49. '   Dim lngResult        As Long
  50. '   Dim bytUtf8()        As Byte
  51. '   Dim n                As Long
  52. '
  53. '   If LenB(sUTF8) = 0 Then Exit Function
  54. '
  55. ''   If m_bIsNt Then
  56. '      On Error GoTo EndFunction
  57. '      bytUtf8 = StrConv(sUTF8, vbFromUnicode)
  58. '      lngUtf8Size = UBound(bytUtf8) + 1
  59. '      On Error GoTo 0
  60. '      'Set buffer for longest possible string i.e. each byte is
  61. '      'ANSI, thus 1 unicode(2 bytes)for every utf-8 character.
  62. '      lngBufferSize = lngUtf8Size * 2
  63. '      strBuffer = String$(lngBufferSize, vbNullChar)
  64. '      'Translate using code page 65001(UTF-8)
  65. '      lngResult = MultiByteToWideChar(CP_UTF8, 0, bytUtf8(0), _
  66. '         lngUtf8Size, StrPtr(strBuffer), lngBufferSize)
  67. '      'Trim result to actual length
  68. '      If lngResult Then
  69. '         UTF8_Decode = Left$(strBuffer, lngResult)
  70. '      End If
  71. ''   Else
  72. ''      Dim i                As Long
  73. ''      Dim TopIndex         As Long
  74. ''      Dim TwoBytes(1)      As Byte
  75. ''      Dim ThreeBytes(2)    As Byte
  76. ''      Dim AByte            As Byte
  77. ''      Dim TStr             As String
  78. ''      Dim BArray()         As Byte
  79. ''
  80. ''      'Resume on error in case someone inputs text with accents
  81. ''      'that should have been encoded as UTF-8
  82. ''      On Error Resume Next
  83. ''
  84. ''      TopIndex = Len(sUTF8)  ' Number of bytes equal TopIndex+1
  85. ''      If TopIndex = 0 Then Exit Function ' get out if there's nothing to convert
  86. ''      BArray = StrConv(sUTF8, vbFromUnicode)
  87. ''      i = 0 ' Initialise pointer
  88. ''      TopIndex = TopIndex - 1
  89. ''      ' Iterate through the Byte Array
  90. ''      Do While i <= TopIndex
  91. ''         AByte = BArray(i)
  92. ''         If AByte < &H80 Then
  93. ''            ' Normal ANSI character - use it as is
  94. ''            TStr = TStr & Chr$(AByte): i = i + 1 ' Increment byte array index
  95. ''         ElseIf AByte >= &HE0 Then         'was = &HE1 Then
  96. ''            ' Start of 3 byte UTF-8 group for a character
  97. ''            ' Copy 3 byte to ThreeBytes
  98. ''            ThreeBytes(0) = BArray(i): i = i + 1
  99. ''            ThreeBytes(1) = BArray(i): i = i + 1
  100. ''            ThreeBytes(2) = BArray(i): i = i + 1
  101. ''            ' Convert Byte array to UTF-16 then Unicode
  102. ''            TStr = TStr & ChrW$((ThreeBytes(0) And &HF) * &H1000 + (ThreeBytes(1) And &H3F) * &H40 + (ThreeBytes(2) And &H3F))
  103. ''         ElseIf (AByte >= &HC2) And (AByte <= &HDB) Then
  104. ''            ' Start of 2 byte UTF-8 group for a character
  105. ''            TwoBytes(0) = BArray(i): i = i + 1
  106. ''            TwoBytes(1) = BArray(i): i = i + 1
  107. ''            ' Convert Byte array to UTF-16 then Unicode
  108. ''            TStr = TStr & ChrW$((TwoBytes(0) And &H1F) * &H40 + (TwoBytes(1) And &H3F))
  109. ''         Else
  110. ''            ' Normal ANSI character - use it as is
  111. ''            TStr = TStr & Chr$(AByte): i = i + 1 ' Increment byte array index
  112. ''         End If
  113. ''      Loop
  114. ''      UTF8_Decode = TStr    ' Return the resultant string
  115. ''      Erase BArray
  116. ''   End If
  117. '
  118. 'EndFunction:
  119. '
  120. 'End Function
  121. '
  122. ''Purpose:Convert Unicode string to UTF-8.
  123. 'Public Function UTF8_Encode(ByVal strUnicode As String, Optional ByVal bHTML As Boolean = True) As String
  124. '   Dim i                As Long
  125. '   Dim TLen             As Long
  126. '   Dim lPtr             As Long
  127. '   Dim UTF16            As Long
  128. '   Dim UTF8_EncodeLong  As String
  129. '
  130. '   TLen = Len(strUnicode)
  131. '   If TLen = 0 Then Exit Function
  132. '
  133. ''   If m_bIsNt Then
  134. ''      Dim lngBufferSize    As Long
  135. ''      Dim lngResult        As Long
  136. ''      Dim bytUtf8()        As Byte
  137. ''      'Set buffer for longest possible string.
  138. ''      lngBufferSize = TLen * 3 + 1
  139. ''      ReDim bytUtf8(lngBufferSize - 1)
  140. ''      'Translate using code page 65001(UTF-8).
  141. ''      lngResult = WideCharToMultiByte(CP_UTF8, 0, StrPtr(strUnicode), _
  142. ''         TLen, bytUtf8(0), lngBufferSize, vbNullString, 0)
  143. ''      'Trim result to actual length.
  144. ''      If lngResult Then
  145. ''         lngResult = lngResult - 1
  146. ''         ReDim Preserve bytUtf8(lngResult)
  147. ''         'CopyMemory StrPtr(UTF8_Encode), bytUtf8(0&), lngResult
  148. ''         UTF8_Encode = StrConv(bytUtf8, vbUnicode)
  149. ''         ' For i = 0 To lngResult
  150. ''         '    UTF8_Encode = UTF8_Encode & Chr$(bytUtf8(i))
  151. ''         ' Next
  152. ''      End If
  153. ''   Else
  154. ''      For i = 1 To TLen
  155. ''         ' Get UTF-16 value of Unicode character
  156. ''         lPtr = StrPtr(strUnicode) + ((i - 1) * 2)
  157. ''         CopyMemory UTF16, ByVal lPtr, 2
  158. ''         'Convert to UTF-8
  159. ''         If UTF16 < &H80 Then                                      ' 1 UTF-8 byte
  160. ''            UTF8_EncodeLong = Chr$(UTF16)
  161. ''         ElseIf UTF16 < &H800 Then                                 ' 2 UTF-8 bytes
  162. ''            UTF8_EncodeLong = Chr$(&H80 + (UTF16 And &H3F))              ' Least Significant 6 bits
  163. ''            UTF16 = UTF16  &H40                                   ' Shift right 6 bits
  164. ''            UTF8_EncodeLong = Chr$(&HC0 + (UTF16 And &H1F)) & UTF8_EncodeLong  ' Use 5 remaining bits
  165. ''         Else                                                      ' 3 UTF-8 bytes
  166. ''            UTF8_EncodeLong = Chr$(&H80 + (UTF16 And &H3F))              ' Least Significant 6 bits
  167. ''            UTF16 = UTF16  &H40                                   ' Shift right 6 bits
  168. ''            UTF8_EncodeLong = Chr$(&H80 + (UTF16 And &H3F)) & UTF8_EncodeLong  ' Use next 6 bits
  169. ''            UTF16 = UTF16  &H40                                   ' Shift right 6 bits
  170. ''            UTF8_EncodeLong = Chr$(&HE0 + (UTF16 And &HF)) & UTF8_EncodeLong   ' Use 4 remaining bits
  171. ''         End If
  172. ''         UTF8_Encode = UTF8_Encode & UTF8_EncodeLong
  173. ''      Next
  174. ''   End If
  175. ''
  176. ''   'Substitute vbCrLf with HTML line breaks if requested.
  177. ''   If bHTML Then
  178. ''      UTF8_Encode = Replace$(UTF8_Encode, vbCrLf, "<br/>")
  179. ''   End If
  180. '
  181. 'End Function
  182. '