Access e google maps

di Anonimizzato19772 il
10 risposte
Salve a tutti, vi porgo un problema in merito alla funzione per visualizzare un indirizzo su google maps da vba access 2007.
Nell'applicazione che ho realizzato funziona correttamente, però se la uso con i nomi di paesi esteri con caratteri strani tipo "Nixhütter Weg" non funziona.
Durante il debug l'indirizzo viene passato correttamente alla variabile, ma quando si apre google maps tenta di trovare "Nixh?tter Weg".
Sapete indicarmi dove può essere il problema?
Grazie.
Di seguito ti mostro il codice (ma ripeto che da debug la ü viene riconosciuta correttamente).

Dim mioform As Form
Dim Via As String
Dim civico As String
Dim Cap As String
Dim Provincia As String
Dim Nazione As String
Dim citta As String
Set mioform = Forms![msc_nuovo_contatto]
Via = Forms![msc_nuovo_contatto]!Via
civico = Forms![msc_nuovo_contatto]![numero civico]
Cap = Forms![msc_nuovo_contatto]!Cap
Provincia = Forms![msc_nuovo_contatto]!Provincia
Nazione = Forms![msc_nuovo_contatto]!Nazione
citta = Forms![msc_nuovo_contatto]![Città]

Dim strLinkURL As String ' indirizzo da visualizzare in Google Maps
Dim strPath As String ' indirizzo della pagina di Google Maps
Dim strAddr() As String ' variabile array
Dim i As Integer ' contatore
' indirizzo di Google Maps
strPath = "http://maps.google.com/maps?"
' indirizzo da localizzare
strLinkURL = Via & " " & _
civico & " " & citta & " " & _
Cap & " " & Provincia & " " & _
Nazione
' assegno alla variabile array l'indirizzo
strAddr = Split(strLinkURL, " ", , vbTextCompare)
strLinkURL = ""
For i = LBound(strAddr()) To UBound(strAddr())
strLinkURL = strLinkURL & strAddr(i) & "+"
Next i
' tolgo il + finale
strLinkURL = Left(strLinkURL, Len(strLinkURL) - 1)
mioform.localizza.HyperlinkAddress = strPath & "q=" & strLinkURL

10 Risposte

  • Grazie per i link, me li studierò.
  • L'errore si verifica in quanto l'indirizzo ("Nixhütter Weg") che fornisci a Google Maps contiene un carattere esteso ("ü") che viene convertito in base al set di caratteri presenti, sul pc, i quali vengono forniti prima al browser e da questi alla chiamata per Google Maps,
    Ad esempio una conversione errata (presa da una semplice stringa di ricerrca) è la seguente

    ove si può notare che il carattere "ü" è tramutato in "%EF%BF%BD";
    mentre quello corretto, ponendo l'indirizzo direttamente in Google Maps, è:


    Una semplice operazione è convertire i caratteri estesi in uno dei caratteri ASCII del set standard come ad esempio "ü" tramutato in "u" per cui la stringa di ricerca:

    fornirà, allo stesso modo, la corretta cittadina in Germania.

    Comunque se si vuole una soluzione complessiva si deve impostare (sul browser del pc) il set di caratteri che comprenda l'insieme impiegato; ti cito alcuni link:
    https://www.lib.uchicago.edu/e/collections/mideast/encyclopedia/browsers.html
    http://www.alanwood.net/unicode/firefox.htm
    http://www.pinyinjoe.com/faq/change-language-for-non-unicode-programs.htm
    http://ec.europa.eu/ipg/standards/unicode/index_en.ht

    https://www.smashingmagazine.com/2012/06/all-about-unicode-utf8-character-sets/
    http://www.linkas.it/docs/unicode_e_UTF-8_v1_5Uni.htm
    http://archive.oreilly.com/pub/a/xml/excerpts/unicode-explained/tables-writing-characters.html
    http://symbolcodes.tlt.psu.edu/browsers/chrome.htm

    Sulle problematiche di encoding con Google-Maps si possono vedere le seguenti discussioni
    http://stackoverflow.com/questions/6329247/google-maps-character-encoding-problem
    http://stackoverflow.com/questions/8960682/google-maps-api-issue-with-non-english-addresses-php-curl
    https://codesimple.net/2006/08/google-maps-utf-8-problem_9034.html
    http://stackoverflow.com/questions/4312896/google-maps-v3-using-accented-characters-in-marker-titles
  • Grazie mille Willy.
  • Ciao Willy, scusa la dabbenaggine, ma dopo 2 ore di ricerca sul web non ho trovato una soluzione semplice, mi potresti spiegare la tua idea di "Una semplice operazione è convertire i caratteri estesi in uno dei caratteri ASCII del set standard"?
    Grazie.
  • La codifica dei caratteri nello standard ASCII originario (a 7 bit) associa i numeri da 0 a 127 ad un carattere ben preciso, ove i numeri da 32 a 126 corrispondono. fra l'altro, in sotto-insiemi, alle cifre numeriche, ai segni di interpunzione ed ai caratteri corrispondenti all'alfabeto latino (dalla A alla Z con le lettere in maiuscolo e minuscolo).
    Quando il codice è stato esteso ad 8 bit, per contemplare caratteri ulteriori, dai 128 caratteri originari si è passati a 256 elementi (da 0 a 255) mantenendo la codifica precedente ed estendo i caratteri da 128 a 255).
    In tale occasione vennero codificati simboli e lettere aggiuntive specifiche (come le vocali accentate).
    Si è passati poi ai "codepage", su PC in ambito DOS. per associare l'insieme dei caratteri ASCII ad una personalizzazione legata al paese di impiego.
    Con l'avvento dei sistemi grafici si è sentita l'esigenza di una ulteriore codifica in modo da sfruttare più caratteri e permettere di utilizzare contemporaneamente più set di caratteri provenienti da lingue diverse; è stato pertanto generato lo standard Unicode.
    Dagli iniziali 65.536 caratteri (sfruttando 16 bit) si è passati ad ordine di grandezza più ampio (impiegando un numero di bit più esteso) i quali sono confluiti nello standard ISO 8859 in grado di supportare gli alfabeti di diverse lingue, attraverso l'identificazione degli innumerevoli simboli e segni che le compongono.
    http://www.usabile.it/unicode.ht
    http://www.carminenoviello.com/it/2008/05/20/unicode-in-5-minuti/

    Ora ritornando al problema in oggetto, in base all'esempio citato, se ricerchi l'indirizzo "Nixhütter Weg", come ti ho indicato contiene un carattere "ü" che non fa parte del set di caratteri ASCII (semplice o esteso) ma impiega un carattere Unicode disposto su 16 bit.
    Infatti se verifichi con un editor, in grado di osservare la codifica di ciascun carattere, potrai avere una situazione del genere:
    
          stringa: Nixhütter Weg
        caratteri: N   i   x   h   ü       t   t   e   r     W   e   g
         decimale: 78 105 120 104 195 188 116 116 101 114 32 87 101 103
      esadecimale: 4E  69  78  68  C3  BC  74 74   65 72  20 57  65  67
          binario: 01001110 01101001 01111000 01101000 11000011 10111100 01110100 01110100 01100101 01110010 00100000 01010111 01100101 01100111
     URL encoded : Nixh%C3%BCtter+Weg
    HTML entities: Nixhütter Weg
    
    ove, quindi, il carattere "ü" viene codificato nella sequenza dei bit corrispondenti a 195 e 188 in decimale (o C3 e BC in esadecimale).
    Da considerare, pertanto, che qualora i caratteri eccedono 127 (in decimale) ci troviamo nel set dei caratteri estesi.
    Se devi ricondurli al set standard dei caratteri ASCII (fino a 127 ove sono presenti le semplici lettere alfabetiche) dovrai effettuare una conversione dalla sequenza dei caratteri estesi in modo da riportarli ad un insieme ridotto e definito che non crei ulteriori problemi di conversione in quanto viene preso a riferimento (in modo fisso) fra i vari passaggi.
    Pertanto tutti i caratteri che eccedono i set standard originario (dotati di accento, dierisi, cediglia, segni diacritici, ecc.) che eccedono il codice ASCII 127 dovranno essere ricondotti, per quanto possibile, all'insieme di base.
    Sulla scorta dell'esempio, dovrai implementare una funzione di conversione in grado di ricondurre la lettera "ü" alla semplice "u" (codificato ASCII come 117 in decimale o 75 in esadecimale) che più si avvicina al carattere originario.
    Attraverso ciò il browser non effettuerà modifiche ulteriori e la stringa di ricerca verrà fornita a Google Maps per il trattamento di individuazione del sito.
    Dopodichè Google Maps procederà, con il suo algoritmo, a trattare la stringa di ricerca al fine di individuare se è riconducibile, nei suoi componenti, agli elementi presenti nel suo database e se l'indirizzo risulta confacente ne presenterà la mappa.

    Altrimenti, come ti ho indicato precedentemente devi agire in base al tuo browser per impostare il set di caratteri estesi (Unicode) della lingua che vuoi supportare.
  • Ciao Willy e grazie ancora per l'ottima spiegazione. Nei link che mi avevi postato la faccenda della codifica l'avevo capita, quello che non riesco a capire (e a trovare in rete) sono degli esempi su come farla. Sai darmi qualche link dove prendere spunto per convertire i caratteri?
    Grazie ancora.
  • Puoi trovare diversi spunti nei link seguenti:
    https://thomashunter.name/blog/convert-ascii-to-utf-8-using-vba/
    http://www.di-mgt.com.au/howto-convert-vba-unicode-to-utf8.html
    http://dailydoseofexcel.com/archives/2010/11/19/unicode-and-vbas-chrw-and-ascw-functions/
    https://bytes.com/topic/access/answers/874752-convert-hex-string
    http://codereview.stackexchange.com/questions/140703/hex-encoding-and-decoding-of-ascii-strings-in-vba
    http://www.vbforums.com/showthread.php?602272-RESOLVED-convert-string-of-hex-into-ascii-characters
    https://www.daniweb.com/programming/software-development/threads/149495/ascii-to-hex-conversion
    http://www.freevbcode.com/ShowCode.asp?ID=255
    http://www.cryptosys.net/pki/manpki/pki_stringstobytes.html
    https://blog.brettski.com/2009/12/04/vba-convert-unicode-to-ascii/
    http://blog.nkadesign.com/2013/vba-unicode-strings-and-the-windows-api/
  • Ciao Willy e grazie per la pazienza. Il concetto l'ho capito, la teoria l'ho capita (convertire il testo con codifica utf-8), quello che non capisco è come mettere in pratica la sostituzione dei caratteri "non standard" tipo "è ò ù ecc...) con la corrispondente "standard (e o u ecc...) per fare in modo che google maps comunque interpreti correttamente la stringa passata e localizzi il posto.
    Ho provato con questo codice:
    
    Dim test As String
    test = "ü"
    ris = tlhAsciiToUtf8(test)
    Debug.Print "'" & ris & "'"
    
    il quale usa la seguente funzione:
    
    Public Function tlhAsciiToUtf8(ByRef strText As String) As String
    On Error GoTo Proc__Err
    
     Dim hexString As Long
     Dim newval As Long
     hexString = Val("&h" & strText)
     If hexString <= 127 Then
       tlhAsciiToUtf8 = "%" & strText
     ElseIf hexString <= 191 Then
       tlhAsciiToUtf8 = "%C2%" & strText
     ElseIf hexString <= 255 Then
       newval = 49856 + hexString
       tlhAsciiToUtf8 = "%" & Mid(Hex(newval), 1, 2) & "%" & Mid(Hex(newval), 3, 2)
     Else
       MsgBox ("NON ASCII CHARACTER: " & hexString)
     End If
    
    Proc__Exit:
        Exit Function
    
    Proc__Err:
        MsgBox Error$
        Resume Proc__Exit
    
    End Function
    
    Ma il risultato della prova passandogli la lettera "ü" è '%ü'
    Help me
  • La funzione che hai scritto non può funzionare contiene errori strutturali molto importanti, nel senso di gravi tecnicamente, ma basilari come livello di conoscenza.
    Ora invece di correggerli, cosa che richiederebbe riscrivere la funzione..., vorrei riflettersi a come questa ipotesi agisce....
    Una funzione di sostituzione è assai probabile possa diventare un collo di bottiglia... come logica...
    Ti faccio un esempio se passi un testo con N caratteri speciali uguali l'ideale sarebbe sostituire in un solo colpo tutti... altrimenti devi ciclare la stringa Sporca cercando il carattere speciale e sostituendolo.
    Se i caratteri speciali sono >1 allora devi fare 2 cicli annidati... questo rallenta molto il processo.

    Valuta al suo posto il banale uso 'mirato' di Replace consecutivi.

    Devo tuttavia suggerirti di fare qualche passo di base sulla strutturazione di Funzioni... altrimenti non potrai ottenere nulla.
Devi accedere o registrarti per scrivere nel forum
10 risposte