Bonjour,

Je récupère des informations de l'API Youtube pour les stocker dans une base MariaDB, notamment le champ "description de la chaine". Pour ce faire, j'appelle l'API via un objet Microsoft.XMLHTTP et je parse le ResponseBody avec l'excellent JSON_CONVERTER de Tim Hall.
Mon problème: si la donnée renvoyée par l'API Youtube contient des caractères arabes, ils sont remplacés par des points d'interrogations en base (et à l'affichage dans le débuggueur VBA).

Exemple:
Nom : Capture.PNG
Affichages : 150
Taille : 28,5 Ko
conduira en base à:
Nom : Capture2.PNG
Affichages : 166
Taille : 15,8 Ko

A noter que la table réceptrice est en utf8mb4 de même que la colonne et que si je fais la mise à jour de la colonne directement depuis l'éditeur MySQL, les caractères sont correctement gérés

Le code de récupération des informations de l'API Youtube:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Sub traitement_youtube_channel(youtube_channel As String)
 
    On Error GoTo errorHandler
 
    ' Recherche du user et des métadonnées
    html_channel_url_get = "https://www.googleapis.com/youtube/v3/channels?"
    html_channel_url_get = html_channel_url_get & "part=id%2Csnippet%2Cstatistics%2CtopicDetails&id="
    html_channel_url_get = html_channel_url_get & youtube_channel & "&key=" & tab_key_api_youtube(ind_tab_key_api_youtube)
 
    Set XML = CreateObject("Microsoft.XMLHTTP")
    XML.Open "GET", html_channel_url_get, False
    XML.Send
    json_channel_unparsed = sUTF8ToUni((XML.ResponseBody))
 
    string_error = Chr(34) & "totalResults" & Chr(34) & ": 0,"
 
    DoEvents
 
    If InStr(1, json_channel_unparsed, string_error) = 0 Then
        Dim Json As Object
        Set Json = JsonConverter.ParseJson(json_channel_unparsed)
        DoEvents
        channel_id = Json("items")(1)("id")
        channel_screen_name = Json("items")(1)("snippet")("title")
        channel_name = Json("items")(1)("snippet")("customUrl")
        channel_description = Json("items")(1)("snippet")("description")
        channel_creation_date = Left(Json("items")(1)("snippet")("publishedAt"), 10)
        channel_nb_vues = Json("items")(1)("statistics")("viewCount")
        channel_nb_abonnes = Json("items")(1)("statistics")("subscriberCount")
        channel_nb_videos = Json("items")(1)("statistics")("videoCount")
    End If
Exit Sub
 
errorHandler:
    procedure_en_cours = "traitement_youtube_channel"
    msg_err_mod = "Erreur dans le module " & Application.VBE.ActiveCodePane.CodeModule.Name & " et à la ligne " & Erl() & " de la procédure " & procedure_en_cours & "."
    msg_err_mod = msg_err_mod & vbCrLf & "Numéro erreur:" & Err.Number
    msg_err_mod = msg_err_mod & vbCrLf & "Description de l'erreur:" & Err.Description
    MsgBox msg_err_mod, , "Erreur de traitement"
    End
 
End Sub
Le code de la fonction sUTF8ToUni

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
Public Function sUTF8ToUni(bySrc() As Byte) As String
   ' Converts a UTF-8 byte array to a Unicode string
   Dim lBytes As Long, lNC As Long, lRet As Long
 
   lBytes = UBound(bySrc) - LBound(bySrc) + 1
   lNC = lBytes
   sUTF8ToUni = String$(lNC, Chr(0))
   lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(bySrc(LBound(bySrc))), lBytes, StrPtr(sUTF8ToUni), lNC)
   sUTF8ToUni = Left$(sUTF8ToUni, lRet)
End Function
Des idées?