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!