【问题标题】:VBSCRIPT REPLACE not removing spaces from Decrypted fieldsVBSCRIPT REPLACE 未从解密字段中删除空格
【发布时间】:2020-03-31 17:18:26
【问题描述】:

真是让人头疼....

我正在使用 VBScript 函数 REPLACE 将 MSSQL DB 中解密字段中的空格替换为“/”。

但是 REPLACE 函数并没有“看到”空格。

例如,如果我运行以下任何一项,其中“ITF_U_ClientName_Denc”字段的解密值为“Johnny Carson”:

REPLACE(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc")," ","/")
REPLACE(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc")," ","/")
REPLACE(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc"),"Chr(160)","/")
REPLACE(CSTR(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc"))," ","/")
REPLACE(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc")," ","/",1,-1,1)
REPLACE(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc")," ","/",1,-1,0)

返回值为“Johnny Carson”(空格不替换为/)

问题似乎只与空格有关,因为当我运行它时: REPLACE(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc"),"a","/")

我得到“Johnny C/rson”。

此外,问题似乎完全在于解密值中的空格,因为当我运行这个时:

REPLACE("Johnny Carson"," ","/")

当然,返回值是“Johnny/Carson”。

我已经检查了正在写入页面源的内容,它只是“Johnny Carson”,没有编码或特殊字符。

我也尝试了 SPLIT 函数来查看它是否会“看到”空间,但它没有。

最后,感谢有用的评论,我尝试使用 VBS REGEX 搜索 \s。

Set regExp = New RegExp
regExp.IgnoreCase = True
regExp.Global = True
regExp.Pattern = "\s" 'Add here every character you don't consider as special character
strProcessed = regExp.Replace(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc"), "?")

很遗憾,strProcessed 会返回“Johnny Carson”(即未检测到/删除空格)。

如果我替换 regExp.Pattern = "a",strProcessed 将返回 "Johnny C?rson"。

非常感谢您的帮助!!

【问题讨论】:

  • 可能是编码问题,你试过正则表达式吗?示例:stackoverflow.com/questions/28853070/… \s 用于空格,\S 用于非空格。
  • 不是正则表达式,但我尝试使用此处解决方案中列出的每个空间变体替换:stackoverflow.com/questions/8515365/…。我将尝试使用 REGEX 方法来查看它“看到”解密的空间。
  • 刚刚尝试使用 REGEX,但它也没有“看到”空间(请参阅问题更新)。
  • 嗯。所以你是说asc(mid(thatstring,7,1)) 返回 32(这是空间)?
  • Response.Write(asc(mid("Johnny Carson",7,1))) 返回 32 但 Response.Write(asc(mid(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc"),7,1 ))) 返回 15712 (𕜒 无效字符)。尽管如此,REPLACE(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc"),"𕜒","/",1,-1,1) 返回“Johnny Carson”(即没有找到 𕜒)。

标签: sql-server encryption replace vbscript spaces


【解决方案1】:

我们发现,正确的字符代码是 160,这就成功了:

replace(..., ChrW(160), "...")

这似乎是特定于数据的,此外,作为替代方案,您可以尝试获取源脚本的相同编码(即使用 Save As with Encoding 保存),或将接收到的数据库值转换为不同的目标编码。

【讨论】:

  • 其实ASC()显示的字符是-15712 但是REPLACE(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc"),ChrW(-15712),"/"), REPLACE(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc") "),ChrW(15712),"/") 和 REPLACE(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc")," ","/") 都显示“Johnny Carson”(即找不到空格):(
  • 如果尝试用于双字节字符集的 AscW,即Response.Write(AscW(mid(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc"),7,1))),您是否看到相同的 -15712?您是否还尝试将 db 值分配给本地字符串变量,即 s = ITF_U_Ledger.Fields("ITF_U_ClientName_Denc") 然后替换?
  • Y,我在尝试重播之前将该字段分配给了一个变量,并且还尝试了 strFullName = CSTR(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc")。当我运行 AscW 版本时,我得到 160。是吗?线索?
  • 160 代表   / 不间断空格 en.wikipedia.org/wiki/Non-breaking_space 即看起来这不是 UTF 或 ASCII 而是 ANSI。请尝试replace("...", ChrW(160), "...")
  • 就是这样! strFullName = CSTR(ITF_U_Ledger.Fields("ITF_U_ClientName_Denc")) strFullName = REPLACE(strFullName,ChrW(160),"/") 产生“Johnny/Carson”。想重新设计这个作为答案,我会给你解决方案的功劳?
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多