我在ASP classic中遇到过关于字符串行为的益智游戏。
代码从会话中提取一些值,然后尝试将它们用作字符串。
问题是该值以某种方式取消了字符串连接。
Dim testVar
testVar = session("test") <- this value is "aaa"
response.write "XXX - " & testVar & " - XXX"
该代码打印XXX - aaa
或者,如果我将testVar设置为某个字符串值la testVar="bbb"
,则字符串连接将按预期工作。
我在试图解决这个问题时发现了另外一件事......
StrComp(testVar, "aaa" ,0)
返回1
StrComp(testVar, "aaa" ,1)
返回0
那么为什么我的testVar会杀死连接的任何想法?
答案 0 :(得分:3)
如果字符串末尾有空字符,那么StrComp
行为就会出现;这也可以防止随后的连接。
您可以通过查看ascw(right(testVar, 1)) = 0
砍掉它:testVar = left(testVar, len(testVar) - 1)
答案 1 :(得分:0)
从
可以看出>> 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)既不取消也不阻止连接。 显示问题是由VBScript的IO方法的特性引起的。
如果你有一个地方/一段代码来获取或显示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 = ".\29988189.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!