Re: How to save an XML doc to a variable? by Paul
Paul
Thu Apr 05 19:52:26 CDT 2007
"Anthony Jones" <Ant@yadayadayada.com> wrote in message
news:%23LXJwZ3dHHA.4308@TK2MSFTNGP02.phx.gbl...
>
> "Paul Randall" <paulr901@cableone.net> wrote in message
> news:O$jI4mucHHA.4684@TK2MSFTNGP06.phx.gbl...
>>
>> 5. The FileStream object can be forced to read a Unicode file (containing
> a
>> BOM) as Ascii. For some arbitrary number of bytes, the reading goes
>> well;
>> after that garbage is returned with no indication of any problem.
>
> Can you post a small repro for this. Whilst you can force TextStream to
> read a unicode file as 'Ascii' the bytestream will be treated as if it
> were
> correctly coded for the current codepage. Typically this makes the string
> appear to have a null character between each other character.
The script attached and listed below demonstrates that, using the file
system object, VBScript cannot reliably read, as ASCII, files starting with
a BOM (two bytes hex FFFE). On my WXPPro SP2 with IE6 and Vista Home Basic
systems I get the same result: no difference in the two files until about
byte position 17,039,361 even though the command line FC program shows that
the first difference is actually at byte postion hex 18804.
'VBScript to test the ability to read all the individual bytes
' of a Unicode file, when the file is opened as ASCII.
'"Unicode file" is defined as a file starting with the two-byte
' BOM of hex FFFE.
'
'Builds the Unicode two ways. Real Unicode file is made by
' opening a text file as Unicode and writing a string to it.
' Fake Unicode file is made by building a similar string with
' Chr(0) following every character, and first writing a BOM
' (two-byte hex value FFFE) to the file.
'
Option Explicit
MsgBox "started in " & vbCrLf & _
WScript.CreateObject("WScript.Shell").CurrentDirectory
'FUN = fake unicode; every other character is Chr(0), starting
' with the second character.
'Real and fake unicode files will be created by repeating a
' 224-character string consisting of Chr(32) through Chr(63)
' followed by Chr(32) through Chr(127)
' followed by Chr(160) through Chr(255)
'Fake unicode file will contain an extra Chr(65) & Chr(0) every
' 100356 bytes.
Const ForReading = 1
Const TristateFalse = 0
Dim i, sa1(223), s224, sa224(223), s50176, sa50176(223), s11Meg
Dim sFUN224, saFUN224(223), sFUN50176, saFUN50176(223), sFUN11Meg
'Create the 224 character ASCII building block and the
' 448-character fake unicode building block.
For i = 0 To 31: sa1(i) = Chr(i + 32): Next
For i = 32 To 127: sa1(i) = Chr(i): Next
For i = 160 To 255: sa1(i-32) = Chr(i): Next
s224 = Join(sa1, "")
sFUN224 = Join(sa1, Chr(0)) & Chr(0)
'Join 224 of the ASCII building blocks.
'Join 224 of the fake unicode building blocks, but add
' an extra Unicode character "A", Chr(65) & Chr(0)
For i = 0 To 223: sa224(i) = s224: Next
s50176 = Join(sa224, "")
For i = 0 To 223: saFUN224(i) = sFUN224: Next
'Use following to show what happens when files should
' be identical
'sFUN50176 = Join(saFUN224, "")
'Use following to show what happens when files should
' be different
sFUN50176 = Join(saFUN224, "") & Chr(65) & Chr(0)
'Join 224 of the previous building block.
'Each now contains about 224 * 224 * 224 characters, either
' ASCII or fake unicode.
For i = 0 To 223: sa50176(i) = s50176: Next
s11Meg = Join(sa50176, "")
For i = 0 To 223: saFUN50176(i) = sFUN50176: Next
saFUN50176(223) = saFUN50176(223)
sFUN11Meg = Join(saFUN50176, "")
'Write the ASCII string to a file as Unicode
Dim objFSO, objTS, bOverWrite, bUnicode
bOverWrite = True
bUnicode = True
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.CreateTextFile("UN1.txt", bOverWrite, bUnicode)
objTS.Write(s11Meg)
objTS.Close
'Write a BOM followed by the fake ASCII sting to a file as ASCII.
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.CreateTextFile("FUN1.txt", bOverWrite, Not bUnicode)
objTS.Write(Chr(255) & Chr(254))
objTS.Write(sFUN11Meg)
objTS.Close
Dim sReadBackU, sReadBackFUN
Set objTS = objFSO.OpenTextFile("UN1.txt", ForReading, , TristateFalse)
sReadBackU = objTS.ReadAll
Set objTS = objFSO.OpenTextFile("FUN1.txt", ForReading, , TristateFalse)
sReadBackFUN = objTS.ReadAll
For i = 0 To len(sReadBackU)
If Mid(sReadBackU, i+1, 1) <> Mid(sReadBackFUN, i+1, 1) Then
MsgBox "First difference found at " & FormatNumber(i+1, 0) & _
" Hex " & Hex(i+1) & vbCrLf & _
"First difference should have occurred at about " & _
FormatNumber(Len(sFUN50176) - 1, 0) & _
" Hex " & Hex(Len(sFUN50176) - 1) & _
vbCrLf & _
"Byte count read from real unicode file = " & _
FormatNumber(Len(sReadBackU), 0) & vbCrLf & _
"Byte count read from fake unicode file = " & _
FormatNumber(Len(sReadBackFUN), 0) & vbCrLf & _
"Difference in length = " & Abs(Len(sReadBackU) - Len(sReadBackFUN))
WScript.Quit
End If
Next
MsgBox "No differences found"
-Paul Randall
begin 666 RdUniAsc.vbs.txt
M)U1H:7,@<V-R:7!T(&-A;B!B92!R=6X@=VET:"!74V-R:7!T(&]R($-38W)I
M<'0N#0HG5D)38W)I<'0@=&\@=&5S="!T:&4@86)I;&ET>2!T;R!R96%D(&%L
M;"!T:&4@:6YD:79I9'5A;"!B>71E<PT*)PEO9B!A(%5N:6-O9&4@9FEL92P@
M=VAE;B!T:&4@9FEL92!I<R!O<&5N960@87,@05-#24DN#0HG(E5N:6-O9&4@
M9FEL92(@:7,@9&5F:6YE9"!A<R!A(&9I;&4@<W1A<G1I;F<@=VET:"!T:&4@
M='=O+6)Y=&4-"B<)0D]-(&]F(&AE>"!&1D9%+@T*)PT*)T)U:6QD<R!T:&4@
M56YI8V]D92!T=V\@=V%Y<RX@(%)E86P@56YI8V]D92!F:6QE(&ES(&UA9&4@
M8GD-"B<);W!E;FEN9R!A('1E>'0@9FEL92!A<R!5;FEC;V1E(&%N9"!W<FET
M:6YG(&$@<W1R:6YG('1O(&ET+@T*)PE&86ME(%5N:6-O9&4@9FEL92!I<R!M
M861E(&)Y(&)U:6QD:6YG(&$@<VEM:6QA<B!S=')I;F<@=VET:" -"B<)0VAR
M*# I(&9O;&QO=VEN9R!E=F5R>2!C:&%R86-T97(L(&%N9"!F:7)S="!W<FET
M:6YG(&$@0D]-#0HG"2AT=V\M8GET92!H97@@=F%L=64@1D9&12D@=&\@=&AE
M(&9I;&4N#0HG#0I/<'1I;VX@17AP;&EC:70-"DUS9T)O>" B<W1A<G1E9"!I
M;B B("8@=F)#<DQF("8@7PT*"5=38W)I<'0N0W)E871E3V)J96-T*")74V-R
M:7!T+E-H96QL(BDN0W5R<F5N=$1I<F5C=&]R>0T*#0HG1E5.(#T@9F%K92!U
M;FEC;V1E.R!E=F5R>2!O=&AE<B!C:&%R86-T97(@:7,@0VAR*# I+"!S=&%R
M=&EN9R -"B<)=VET:"!T:&4@<V5C;VYD(&-H87)A8W1E<BX-"B=296%L(&%N
M9"!F86ME('5N:6-O9&4@9FEL97,@=VEL;"!B92!C<F5A=&5D(&)Y(')E<&5A
M=&EN9R!A#0HG"3(R-"UC:&%R86-T97(@<W1R:6YG(&-O;G-I<W1I;F<@;V8@
M0VAR*#,R*2!T:')O=6=H($-H<B@V,RD-"B<)9F]L;&]W960@8GD@0VAR*#,R
M*2!T:')O=6=H($-H<B@Q,C<I#0HG"69O;&QO=V5D(&)Y($-H<B@Q-C I('1H
M<F]U9V@@0VAR*#(U-2D-"B=&86ME('5N:6-O9&4@9FEL92!W:6QL(&-O;G1A
M:6X@86X@97AT<F$@0VAR*#8U*2 F($-H<B@P*2!E=F5R>0T*)PDQ,# S-38@
M8GET97,N#0H-"D-O;G-T($9O<E)E861I;F<@/2 Q#0I#;VYS="!4<FES=&%T
M949A;'-E(#T@, T*#0I$:6T@:2P@<V$Q*#(R,RDL(',R,C0L('-A,C(T*#(R
M,RDL(',U,#$W-BP@<V$U,#$W-B@R,C,I+"!S,3%-96<-"D1I;2!S1E5.,C(T
M+"!S84953C(R-"@R,C,I+"!S1E5.-3 Q-S8L('-A1E5.-3 Q-S8H,C(S*2P@
M<T953C$Q365G#0H-"B=#<F5A=&4@=&AE(#(R-"!C:&%R86-T97(@05-#24D@
M8G5I;&1I;F<@8FQO8VL@86YD('1H90T*)PDT-#@M8VAA<F%C=&5R(&9A:V4@
M=6YI8V]D92!B=6EL9&EN9R!B;&]C:RX-"D9O<B!I(#T@,"!4;R S,3H@<V$Q
M*&DI(#T@0VAR*&D@*R S,BDZ($YE>'0-"D9O<B!I(#T@,S(@5&\@,3(W.B!S
M83$H:2D@/2!#:'(H:2DZ($YE>'0-"D9O<B!I(#T@,38P(%1O(#(U-3H@<V$Q
M*&DM,S(I(#T@0VAR*&DI.B!.97AT#0IS,C(T(#T@2F]I;BAS83$L("(B*0T*
M<T953C(R-" ]($IO:6XH<V$Q+"!#:'(H,"DI("8@0VAR*# I#0H-"B=*;VEN
M(#(R-"!O9B!T:&4@05-#24D@8G5I;&1I;F<@8FQO8VMS+@T*)TIO:6X@,C(T
M(&]F('1H92!F86ME('5N:6-O9&4@8G5I;&1I;F<@8FQO8VMS+"!B=70@861D
M#0HG"6%N(&5X=')A(%5N:6-O9&4@8VAA<F%C=&5R(")!(BP@0VAR*#8U*2 F
M($-H<B@P*0T*1F]R(&D@/2 P(%1O(#(R,SH@<V$R,C0H:2D@/2!S,C(T.B!.
M97AT#0IS-3 Q-S8@/2!*;VEN*'-A,C(T+" B(BD-"D9O<B!I(#T@,"!4;R R
M,C,Z('-A1E5.,C(T*&DI(#T@<T953C(R-#H@3F5X= T*#0HG57-E(&9O;&QO
M=VEN9R!T;R!S:&]W('=H870@:&%P<&5N<R!W:&5N(&9I;&5S('-H;W5L9 T*
M)PEB92!I9&5N=&EC86P-"B=S1E5.-3 Q-S8@/2!*;VEN*'-A1E5.,C(T+" B
M(BD-"@T*)U5S92!F;VQL;W=I;F<@=&\@<VAO=R!W:&%T(&AA<'!E;G,@=VAE
M;B!F:6QE<R!S:&]U;&0-"B<)8F4@9&EF9F5R96YT#0IS1E5.-3 Q-S8@/2!*
M;VEN*'-A1E5.,C(T+" B(BD@)B!#:'(H-C4I("8@0VAR*# I#0H-"B=*;VEN
M(#(R-"!O9B!T:&4@<')E=FEO=7,@8G5I;&1I;F<@8FQO8VLN(" -"B=%86-H
M(&YO=R!C;VYT86EN<R!A8F]U=" R,C0@*B R,C0@*B R,C0@8VAA<F%C=&5R
M<RP@96ET:&5R#0HG"4%30TE)(&]R(&9A:V4@=6YI8V]D92X-"D9O<B!I(#T@
M,"!4;R R,C,Z('-A-3 Q-S8H:2D@/2!S-3 Q-S8Z($YE>'0-"G,Q,4UE9R ]
M($IO:6XH<V$U,#$W-BP@(B(I#0I&;W(@:2 ](# @5&\@,C(S.B!S84953C4P
M,3<V*&DI(#T@<T953C4P,3<V.B!.97AT#0IS84953C4P,3<V*#(R,RD@/2!S
M84953C4P,3<V*#(R,RD-"G-&54XQ,4UE9R ]($IO:6XH<V%&54XU,#$W-BP@
M(B(I#0H-"B=7<FET92!T:&4@05-#24D@<W1R:6YG('1O(&$@9FEL92!A<R!5
M;FEC;V1E#0I$:6T@;V)J1E-/+"!O8FI44RP@8D]V97)7<FET92P@8E5N:6-O
M9&4-"F)/=F5R5W)I=&4@/2!4<G5E#0IB56YI8V]D92 ](%1R=64-"E-E="!O
M8FI&4T\@/2!#<F5A=&5/8FIE8W0H(E-C<FEP=&EN9RY&:6QE4WES=&5M3V)J
M96-T(BD-"E-E="!O8FI44R ](&]B:D933RY#<F5A=&5497AT1FEL92@B54XQ
M+G1X="(L(&)/=F5R5W)I=&4L(&)5;FEC;V1E*0T*;V)J5%,N5W)I=&4H<S$Q
M365G*0T*;V)J5%,N0VQO<V4-"@T*)U=R:71E(&$@0D]-(&9O;&QO=V5D(&)Y
M('1H92!F86ME($%30TE)('-T:6YG('1O(&$@9FEL92!A<R!!4T-)22X-"E-E
M="!O8FI&4T\@/2!#<F5A=&5/8FIE8W0H(E-C<FEP=&EN9RY&:6QE4WES=&5M
M3V)J96-T(BD-"E-E="!O8FI44R ](&]B:D933RY#<F5A=&5497AT1FEL92@B
M1E5.,2YT>'0B+"!B3W9E<E=R:71E+"!.;W0@8E5N:6-O9&4I#0IO8FI44RY7
M<FET92A#:'(H,C4U*2 F($-H<B@R-30I*0T*;V)J5%,N5W)I=&4H<T953C$Q
M365G*0T*;V)J5%,N0VQO<V4-"@T*1&EM('-296%D0F%C:U4L('-296%D0F%C
M:T953@T*4V5T(&]B:E13(#T@;V)J1E-/+D]P96Y497AT1FEL92@B54XQ+G1X
M="(L($9O<E)E861I;F<L("P@5')I<W1A=&5&86QS92D-"G-296%D0F%C:U4@
M/2!O8FI44RY296%D06QL#0I3970@;V)J5%,@/2!O8FI&4T\N3W!E;E1E>'1&
M:6QE*")&54XQ+G1X="(L($9O<E)E861I;F<L("P@5')I<W1A=&5&86QS92D-
M"G-296%D0F%C:T953B ](&]B:E13+E)E861!;&P-"@T*1F]R(&D@/2 P(%1O
M(&QE;BAS4F5A9$)A8VM5*0T*"4EF($UI9"AS4F5A9$)A8VM5+"!I*S$L(#$I
M(#P^($UI9"AS4F5A9$)A8VM&54XL(&DK,2P@,2D@5&AE;@T*"0E-<V=";W@@
M(D9I<G-T(&1I9F9E<F5N8V4@9F]U;F0@870@(B F($9O<FUA=$YU;6)E<BAI
M*S$L(# I("8@7PT*"0D)(B @2&5X("(@)B!(97@H:2LQ*2 F('9B0W),9B F
M(%\-"@D)"2)&:7)S="!D:69F97)E;F-E('-H;W5L9"!H879E(&]C8W5R<F5D
M(&%T(&%B;W5T("(@)B!?#0H)"0E&;W)M871.=6UB97(H3&5N*'-&54XU,#$W
M-BD@+2 Q+" P*2 F(%\-"@D)"2(@($AE>" B("8@2&5X*$QE;BAS1E5.-3 Q
M-S8I("T@,2D@)B!?#0H)"0EV8D-R3&8@)B!?#0H)"0DB0GET92!C;W5N="!R
M96%D(&9R;VT@<F5A;"!U;FEC;V1E(&9I;&4@/2 B("8@7PT*"0D)1F]R;6%T
M3G5M8F5R*$QE;BAS4F5A9$)A8VM5*2P@,"D@)B!V8D-R3&8@)B!?#0H)"0DB
M0GET92!C;W5N="!R96%D(&9R;VT@9F%K92!U;FEC;V1E(&9I;&4@/2 B("8@
M7PT*"0D)1F]R;6%T3G5M8F5R*$QE;BAS4F5A9$)A8VM&54XI+" P*2 F('9B
M0W),9B F(%\-"@D)"2)$:69F97)E;F-E(&EN(&QE;F=T:" ]("(@)B!!8G,H
M3&5N*'-296%D0F%C:U4I("T@3&5N*'-296%D0F%C:T953BDI#0H)"5=38W)I
M<'0N475I= T*"45N9"!)9@T*3F5X= T*#0I-<V=";W@@3&5N*'-296%D0F%C
M:U4I("8@=F)#<DQF("8@3&5N*'-296%D0F%C:T953BD-"@T*475I=" B06QL
M($1O;F4B#0HG*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ
M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ#0I&
M=6YC=&EO;B!I;F-L=61E*'-&:6QE3F%M92D-"B=2971U<FX@82!S=')I;F<@
M8V]N=&%I;FEN9R!T:&4@96YT:7)E(&-O;G1E;G1S(&]F( T*)PET:&4@<W!E
M8VEF:65D(&9I;&4N#0H)1&EM(&]B:D933PT*"41I;2!O8FI&:6QE#0H)4V5T
M(&]B:D933R ]($-R96%T94]B:F5C="@B4V-R:7!T:6YG+D9I;&53>7-T96U/
M8FIE8W0B*0T*"4]N($5R<F]R(%)E<W5M92!.97AT#0H)4V5T(&]B:D9I;&4@
M/2!O8FI&4T\N3W!E;E1E>'1&:6QE*'-&:6QE3F%M92D-"@E)9B!%<G(@=&AE
M;@T*"0E-<V=B;W@@(E%U:71T:6YG("T@9FEL92 B("8@<T9I;&5.86UE("8@
M(B!C86X@;F]T(&)E(&EN8VQU9&5D+B(-"@D)5W-C<FEP="Y1=6ET#0H)16YD
M($EF#0H)3VX@17)R;W(@1V]4;R P#0H):6YC;'5D92 ](&]B:D9I;&4N4F5A
M9$%L;"@I#0H);V)J1FEL92Y#;&]S90T*16YD($9U;F-T:6]N"2=I;F-L=61E
,*$9I;&5.86UE*0T*
`
end