ASP 经典会话字符串正在取消连接
ASP Classic session string is canceling concatenation
我在 ASP 经典中遇到了一个关于字符串行为的谜题。
代码从会话中提取一些值,然后尝试将它们用作字符串。
问题是该值以某种方式取消了字符串连接。
Dim testVar
testVar = session("test") <- this value is "aaa"
response.write "XXX - " & testVar & " - XXX"
该代码打印 XXX - aaa
或者,如果我将 testVar 设置为某个字符串值 a la testVar="bbb"
,字符串连接会按预期工作。
我在尝试解决这个问题时发现的另一件事...
StrComp(testVar, "aaa" ,0)
returns 1
StrComp(testVar, "aaa" ,1)
returns 0
那么为什么我的 testVar 会终止串联?
如果字符串末尾有空字符,您会看到 StrComp
行为;这也将阻止随后的连接。
您可以通过查看 ascw(right(testVar, 1)) = 0
来验证这一点
砍掉它:testVar = left(testVar, len(testVar) - 1)
从
可以看出
>> For Each s In Array("AB", "A" & Chrw(0))
>> s = "XXX - " & s & " - XXX"
>> WScript.Echo Len(s), s
>> Next
>>
14 XXX - AB - XXX
14 XXX - A
ChrW(0)s 既不取消也不阻止连接。 显示问题是由 VBScript 的 IO 方法的特殊性引起的。
如果您有一个 place/piece 代码用于获取或显示 testVar(您可能应该这样做),一个
s = Replace(s, ChrW(0), "WhateverMakesSenseInYourContext")
应该可以解决问题。
证据:
>> For Each s In Array("AB", "A" & Chrw(0))
>> s = "XXX - " & s & " - XXX"
>> s = Replace(s, ChrW(0), "")
>> WScript.Echo Len(s), s
>> Next
>>
14 XXX - AB - XXX
13 XXX - A - XXX
进一步深思:
Option Explicit
Const csFSpec = ".988189.data"
Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")
Dim sData : sData = "Danger" & ChrW(0) & " Will Robinson!"
Dim tsIO : Set tsIO = goFS.CreateTextFile(csFSpec)
tsIO.WriteLine sData
tsIO.Close
sData = goFS.OpenTextFile(csFSpec).ReadLine()
WScript.Echo Len(sData), Replace(sData, ChrW(0), ",")
输出:
cscript 29988189.vbs
22 Danger, Will Robinson!
我在 ASP 经典中遇到了一个关于字符串行为的谜题。
代码从会话中提取一些值,然后尝试将它们用作字符串。
问题是该值以某种方式取消了字符串连接。
Dim testVar
testVar = session("test") <- this value is "aaa"
response.write "XXX - " & testVar & " - XXX"
该代码打印 XXX - aaa
或者,如果我将 testVar 设置为某个字符串值 a la testVar="bbb"
,字符串连接会按预期工作。
我在尝试解决这个问题时发现的另一件事...
StrComp(testVar, "aaa" ,0)
returns 1
StrComp(testVar, "aaa" ,1)
returns 0
那么为什么我的 testVar 会终止串联?
如果字符串末尾有空字符,您会看到 StrComp
行为;这也将阻止随后的连接。
您可以通过查看 ascw(right(testVar, 1)) = 0
砍掉它:testVar = left(testVar, len(testVar) - 1)
从
可以看出>> For Each s In Array("AB", "A" & Chrw(0))
>> s = "XXX - " & s & " - XXX"
>> WScript.Echo Len(s), s
>> Next
>>
14 XXX - AB - XXX
14 XXX - A
ChrW(0)s 既不取消也不阻止连接。 显示问题是由 VBScript 的 IO 方法的特殊性引起的。
如果您有一个 place/piece 代码用于获取或显示 testVar(您可能应该这样做),一个
s = Replace(s, ChrW(0), "WhateverMakesSenseInYourContext")
应该可以解决问题。
证据:
>> For Each s In Array("AB", "A" & Chrw(0))
>> s = "XXX - " & s & " - XXX"
>> s = Replace(s, ChrW(0), "")
>> WScript.Echo Len(s), s
>> Next
>>
14 XXX - AB - XXX
13 XXX - A - XXX
进一步深思:
Option Explicit
Const csFSpec = ".988189.data"
Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")
Dim sData : sData = "Danger" & ChrW(0) & " Will Robinson!"
Dim tsIO : Set tsIO = goFS.CreateTextFile(csFSpec)
tsIO.WriteLine sData
tsIO.Close
sData = goFS.OpenTextFile(csFSpec).ReadLine()
WScript.Echo Len(sData), Replace(sData, ChrW(0), ",")
输出:
cscript 29988189.vbs
22 Danger, Will Robinson!