107 lines
3.4 KiB
Plaintext
107 lines
3.4 KiB
Plaintext
Function unicode_2_utf8(x As Long) As String
|
|
Dim As String y
|
|
Dim As Long r
|
|
Select Case x
|
|
Case 0 To &H7F
|
|
y = Chr(x)
|
|
Case &H80 To &H7FF
|
|
y = Chr(192 + x \ 64) + Chr(128 + x Mod 64)
|
|
Case &H800 To &H7FFF, 32768 To 65535
|
|
r = x \ 64
|
|
y = Chr(224 + r \ 64) + Chr(128 + r Mod 64) + Chr(128 + x Mod 64)
|
|
Case &H10000 To &H10FFFF
|
|
r = x \ 4096
|
|
y = Chr(240 + r \ 64) + Chr(128 + r Mod 64) + Chr(128 + (x \ 64) Mod 64) + Chr(128 + x Mod 64)
|
|
Case Else
|
|
Print "what else? " & x & " " & Hex(x)
|
|
End Select
|
|
Return y
|
|
End Function
|
|
|
|
Function utf8_2_unicode(x As String) As Long
|
|
Dim As Long primero, segundo, tercero, cuarto
|
|
Dim As Long total
|
|
Select Case Len(x)
|
|
Case 1 'one byte
|
|
If Asc(x) < 128 Then
|
|
total = Asc(x)
|
|
Else
|
|
Print "highest bit set error"
|
|
End If
|
|
Case 2 'two bytes and assume primero byte is leading byte
|
|
If Asc(x) \ 32 = 6 Then
|
|
primero = Asc(x) Mod 32
|
|
If Asc(Mid(x, 2, 1)) \ 64 = 2 Then
|
|
segundo = Asc(Mid(x, 2, 1)) Mod 64
|
|
Else
|
|
Print "mask error"
|
|
End If
|
|
Else
|
|
Print "leading byte error"
|
|
End If
|
|
total = 64 * primero + segundo
|
|
Case 3 'three bytes and assume primero byte is leading byte
|
|
If Asc(x) \ 16 = 14 Then
|
|
primero = Asc(x) Mod 16
|
|
If Asc(Mid(x, 2, 1)) \ 64 = 2 Then
|
|
segundo = Asc(Mid(x, 2, 1)) Mod 64
|
|
If Asc(Mid(x, 3, 1)) \ 64 = 2 Then
|
|
tercero = Asc(Mid(x, 3, 1)) Mod 64
|
|
Else
|
|
Print "mask error last byte"
|
|
End If
|
|
Else
|
|
Print "mask error middle byte"
|
|
End If
|
|
Else
|
|
Print "leading byte error"
|
|
End If
|
|
total = 4096 * primero + 64 * segundo + tercero
|
|
Case 4 'four bytes and assume primero byte is leading byte
|
|
If Asc(x) \ 8 = 30 Then
|
|
primero = Asc(x) Mod 8
|
|
If Asc(Mid(x, 2, 1)) \ 64 = 2 Then
|
|
segundo = Asc(Mid(x, 2, 1)) Mod 64
|
|
If Asc(Mid(x, 3, 1)) \ 64 = 2 Then
|
|
tercero = Asc(Mid(x, 3, 1)) Mod 64
|
|
If Asc(Mid(x, 4, 1)) \ 64 = 2 Then
|
|
cuarto = Asc(Mid(x, 4, 1)) Mod 64
|
|
Else
|
|
Print "mask error last byte"
|
|
End If
|
|
Else
|
|
Print "mask error tercero byte"
|
|
End If
|
|
Else
|
|
Print "mask error second byte"
|
|
End If
|
|
Else
|
|
Print "mask error leading byte"
|
|
End If
|
|
total = Clng(262144 * primero + 4096 * segundo + 64 * tercero + cuarto)
|
|
Case Else
|
|
Print "more bytes than expected"
|
|
End Select
|
|
Return total
|
|
End Function
|
|
|
|
Dim As Long cp(4) = {65, 246, 1046, 8364, 119070} '[{&H0041,&H00F6,&H0416,&H20AC,&H1D11E}]
|
|
Dim As String r, s
|
|
Dim As integer i, j
|
|
Print "ch unicode UTF-8 encoded decoded"
|
|
For i = Lbound(cp) To Ubound(cp)
|
|
Dim As Long cpi = cp(i)
|
|
r = unicode_2_utf8(cpi)
|
|
s = Hex(cpi)
|
|
Print Chr(cpi); Space(10 - Len(s)); s;
|
|
s = ""
|
|
For j = 1 To Len(r)
|
|
s &= Hex(Asc(Mid(r, j, 1))) & " "
|
|
Next j
|
|
Print Space(16 - Len(s)); s;
|
|
s = Hex(utf8_2_unicode(r))
|
|
Print Space(8 - Len(s)); s
|
|
Next i
|
|
|
|
Sleep
|