[VB6]Encoding probleem met MSXML 4.0

Pagina: 1
Acties:
  • 152 views sinds 30-01-2008
  • Reageer

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 12:32

sopsop

[v] [;,,;] [v]

Topicstarter
Het volgende is het geval. Middels IBM MQ-Series wordt een vb-string gevuld met een XML-file. Dat gaat uitermate prima, totdat er een turkse naam in de XML stond. Die werd aardig vervormd door VB/MSXML

De volgende naam hield het niet uit:
code:
1
HöçeL

Dit wordt binnen vb:
code:
1
HöçeL


Wat ik allemaal heb geprobeerd:
Ik heb geprobeerd om de string als Unicode, UTF-8, UTF-16, etc, etc te hercoderen, dat strandde allemaal op niets. De enige oplossing die ik heb kunnen vinden is het eerst wegschrijven van de xml in een tijdelijk bestand, om die daarna te openen met msxml, dat is dus in plaats van direct de var in msXML wegschrijven.

Het wegschrijven via een tijdelijk bestand is hier echter geen optie, vanwege de load die dit teweeg gaat brengen, buiten dat het sowieso al een lelijke oplossing is.

Ik heb een stukje code geschreven die het probleem reproduceert, hier zit ook de optie in verwerkt die via een tijdelijk bestand wel de gewenste output levert:

Visual Basic:
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
   Dim a As String
   Dim oFS As New FileSystemObject
   Dim oTS As TextStream
   Dim oDD As New DOMDocument
   a = "<?xml version=""1.0"" encoding=""UTF-8""?>" & vbCrLf
   a = a & "<testding>HöçeL</testding>"
   
   oDD.loadXML (a)
   oDD.Validate
   Debug.Print "ZONDER FILE TRANSFER:"
   Debug.Print "========================="
   Debug.Print oDD.xml
   Set oDD = Nothing
   
   Set oTS = oFS.CreateTextFile(App.Path & "\test.txt", True, False)
   oTS.WriteLine a
   oTS.Close

   Set oDD = New DOMDocument
   oDD.Load (App.Path & "\test.txt")
   oDD.Validate
   Debug.Print "MET FILE TRANSFER:"
   Debug.Print "========================="
   Debug.Print oDD.xml
      
   Set oDD = Nothing


De output van dit progsel is:
code:
1
2
3
4
5
6
7
8
9
ZONDER FILE TRANSFER:
=========================
<?xml version="1.0"?>
<testding>HöçeL</testding>

MET FILE TRANSFER:
=========================
<?xml version="1.0"?>
<testding>HöçeL</testding>


Feitelijk is mijn vraag dus: hoe kan ik MSXML 'HöçeL' in het XML laten zetten, zonder dat ik van tijdelijke bestanden gebruik moet maken.

[ Voor 16% gewijzigd door sopsop op 25-01-2006 14:48 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14-04 21:30

TeeDee

CQB 241

Je zou het in een Adodb stream kunnen knikkeren.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Sub SaveRemoteFile(From, ToPath)
    Dim oXmlHttp
    Set oXmlHttp = CreateObject("Msxml2.XmlHttp.4.0")
    oXmlHttp.Open "GET", From, False
    oXmlHttp.Send
    If oXmlHttp.Status = 200 Then
        Dim oStream
        Set oStream = CreateObject("Adodb.Stream")
        oStream.Type = 1
        oStream.Open
        oStream.Write oXmlHttp.responseBody
        oStream.SaveToFile ToPath
        oStream.Close
    Else
        Err.Raise vbObjectError + 1, "SaveRemoteFile", oXmlHttp.statusText
    End If
    Set oXmlHttp = nothing
End Sub

Deze code heb ik gevonden in mijn VB Code lib. Weliswaar wordt hier een file weggeschreven, alleen kan je dat afaik ook overslaan en de stream in een string zetten.
Deze code komt uit mijn hoofd van P_de_B.

Edit: Hmm, bovenstaand voorbeeld doet niet helemaal wat je wil ;) denk ik, maar dit is het makkelijkst op te lossen door toch een Adodb.Stream te gebruiken. Door gebruik te maken van een stream kan je vrij simpel de charset setten.

[ Voor 15% gewijzigd door TeeDee op 25-01-2006 15:23 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Aram
  • Registratie: Februari 2004
  • Laatst online: 14-08-2025
Ik heb de volgende code in VB6 gedraait en het werkt gewoon.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 Dim strXML As String
 Dim xmlDoc As New DOMDocument
 
 strXML = "<?xml version=""1.0"" encoding=""UTF-8""?>" & vbCrLf
 strXML = strXML & "<test>HöçeL</test>" & vbCrLf
 
 xmlDoc.loadXML (strXML)
 xmlDoc.Validate

 Debug.Print xmlDoc.documentElement.selectSingleNode("//test").Text
 xmlDoc.documentElement.selectSingleNode("//test").Text = "Tütünciyan"
 Debug.Print xmlDoc.documentElement.selectSingleNode("//test").Text
 
 Set xmlDoc = Nothing

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 12:32

sopsop

[v] [;,,;] [v]

Topicstarter
Aram schreef op woensdag 25 januari 2006 @ 15:51:
Ik heb de volgende code in VB6 gedraait en het werkt gewoon.
Visual Basic:
1
2
3
4
[strip]
 strXML = "<?xml version=""1.0"" encoding=""UTF-8""?>" & vbCrLf
 strXML = strXML & "<test>HöçeL</test>" & vbCrLf
[strip]
Dat is niet zo raar. Je source XML is al 'goed', er is al 'HöçeL' leesbaar, zonder 'rare' karakters.

Als je de volgende code gebruikt werkt het niet:
Visual Basic:
1
2
3
4
[knip]
 strXML = "<?xml version=""1.0"" encoding=""UTF-8""?>" & vbCrLf
 strXML = strXML & "<test>HöçeL</test>" & vbCrLf
[/knip]


Maar ik heb het op weten te lossen via een ADODB.stream:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
   Dim a As String
   Dim sMSG As String
   Dim oDD As New DOMDocument
   Dim oStr As New ADODB.Stream
   
   a = "<?xml version=""1.0"" encoding=""UTF-8""?>" & vbCrLf
   a = a & "<testding>HöçeL</testding>"
      
   oStr.Type = adTypeText
   oStr.Charset = "iso-8859-1"
   oStr.Open
   oStr.WriteText a
   oStr.Position = 0
   oStr.Type = adTypeBinary
   
   oDD.Load (oStr.Read)
   oDD.Validate
   sMSG = sMSG & "   MET FILE TRANSFER:" & vbCrLf
   sMSG = sMSG & "=========================" & vbCrLf
   sMSG = sMSG & oDD.xml & vbCrLf & vbCrLf
      
   Set oDD = Nothing
   oStr.Close
   MsgBox sMSG

Ik had al met een adodb.stream getest, maar ik had de verkeerde characterset gebruikt. Met iso-8859-1 werkt het uitstekend. Nu nog kijken of dit voor alle situaties goed uitpakt.

[ Voor 16% gewijzigd door sopsop op 25-01-2006 17:22 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14-04 21:30

TeeDee

CQB 241

boppert schreef op woensdag 25 januari 2006 @ 17:22:
[...]

Ik had al met een adodb.stream getest, maar ik had de verkeerde characterset gebruikt. Met iso-8859-1 werkt het uitstekend. Nu nog kijken of dit voor alle situaties goed uitpakt.
Ik zou voor het gemak iso-8859-15 pakken. Is afaik een extended set met onder andere het Euro teken.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 12:32

sopsop

[v] [;,,;] [v]

Topicstarter
TeeDee schreef op woensdag 25 januari 2006 @ 17:26:
[...]

Ik zou voor het gemak iso-8859-15 pakken. Is afaik een extended set met onder andere het Euro teken.
als ik in mijn voorbeeldje een euro tekeninvoer (ALT+0128), dan krijg ik bij iso-8859-1 een ? te zien en bij iso-8859-15 een parse error (ongeldig teken gevonden)?????

  • Aram
  • Registratie: Februari 2004
  • Laatst online: 14-08-2025
boppert schreef op woensdag 25 januari 2006 @ 17:22:
[...]


Dat is niet zo raar. Je source XML is al 'goed', er is al 'HöçeL' leesbaar, zonder 'rare' karakters.
Ik ging er vanuit dat je brondata ook goed was omdat je dat stelde in je startpost:
boppert schreef op woensdag 25 januari 2006 @ 14:26:
Het volgende is het geval. Middels IBM MQ-Series wordt een vb-string gevuld met een XML-file. Dat gaat uitermate prima, totdat er een turkse naam in de XML stond. Die werd aardig vervormd door VB/MSXML

De volgende naam hield het niet uit:
code:
1
HöçeL

Dit wordt binnen vb:
code:
1
HöçeL

....
Maar goed, je hebt inmiddels een oplossing :)
Pagina: 1