Il existe une différence entre UTF-8 et Unicode. Les codes des caractéres sont les mêmes mais la représentation différe. Utf-8 utilise 1 à 4(ou même 6) octets alors qu'Unicode utilise 2 octets pour un caractère. Le code suivant permet de transformer une chaîne représentée en UTF-8 en une representée en ANSI. La seule fonction utile est Convert. Cette version se limite à un caractère representé en 3 octets.
Private Function UTF8_2(V1 As Integer, V2 As Integer) As Integer 'Cette fonction permet de retourner la valeur décimale d'un caractére 'en UTF-8 codé sur 2 octets; pour mieux comprendre le codage UTF-8, 'il faut se référer à une documentation bien appropriée. Dim Q%, R% Dim exp%, i% Dim Res$ Dim VAL% 'On convertit les chiffres en binaire Q = V2 While Q <> 0 R = Q Mod 2 Res = CStr(R) & Res Q = Q \ 2 Wend Q = V1 While Q <> 0 R = Q Mod 2 Res = CStr(R) & Res Q = Q \ 2 Wend 'on supprime les deux bits de poids forts des deux octets Res = Mid(Res, 3, 6) & Mid(Res, 11, 6) 'on reconvertit cette chaine binaire en un nombre décimal exp = 0 For i = Len(Res) To 1 Step -1 R = CInt(Mid(Res, i, 1)) VAL = VAL + (R * (2 ^ exp)) exp = exp + 1 Next i UTF8_2 = VAL End Function
Function Convert(chaine As String) As String Dim i% Dim code1%, code2%, code3% Dim VAL& Dim Res$, ch$ i = 1 While (i <= Len(chaine)) ch = Mid(chaine, i, 1) code1 = Asc(ch) If code1 <= 127 Then Res = Res & ch ElseIf code1 <= 223 Then i = i + 1 code2 = Asc(Mid(chaine, i, 1)) VAL = UTF8_2(code1, code2) Res = Res & ChrW(VAL) Else i = i + 1 code2 = Asc(Mid(chaine, i, 1)) i = i + 1 code3 = Asc(Mid(chaine, i, 1)) VAL = UTF8_3(code1, code2, code3) Res = Res & ChrW(VAL) End If i = i + 1 Wend Convert = Res End Function
Private Function UTF8_3(V1 As Integer, V2 As Integer, V3 As Integer) As Long 'Cette fonction permet de retourner la valeur décimale d'un caractére 'en UTF-8 codé sur 3 octets; pour mieux comprendre le codage UTF-8, 'il faut se référer à une documentation bien appropriée. Dim Q%, R% Dim exp%, i% Dim Res$ Dim VAL& 'On convertit les chiffres en binaire Q = V3 While Q <> 0 R = Q Mod 2 Res = CStr(R) & Res Q = Q \ 2 Wend Q = V2 While Q <> 0 R = Q Mod 2 Res = CStr(R) & Res Q = Q \ 2 Wend Q = V1 While Q <> 0 R = Q Mod 2 Res = CStr(R) & Res Q = Q \ 2 Wend 'on supprime les deux bits de poids forts des trois octets Res = Mid(Res, 5, 4) & Mid(Res, 11, 6) & Mid(Res, 19, 6) 'on reconvertit cette chaine binaire en un nombre décimal exp = 0 For i = Len(Res) To 1 Step -1 R = CInt(Mid(Res, i, 1)) VAL = VAL + (R * (2 ^ exp)) exp = exp + 1 Next i UTF8_3 = VAL End Function
|