You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB中如何替换ASCII为155的Control Sequence Introducer控制字符

问题:无法替换字符串中的Control Sequence Introducer控制字符

花费一整天尝试替换从文件读取的字符串内的特殊字符,经检索确认该字符为Control Sequence Introducer(控制序列引入符,简称CSI)。查阅资料显示该字符十六进制编码为9B,对应ASCII编码为155。目前已经成功替换字符串中的空字符,但始终无法移除这个特殊字符。在Notepad++中开启「显示所有符号」功能后,该字符的显示效果参考截图:
Control Sequence Introducer字符显示效果

已尝试以下多种替换方法,均未生效:

strLine = strLine.Replace(Chr(155), " ")
strLine = Replace(strLine , "9B", " ")
strLine = Replace(strLine , "&#x9B", " ")
strLine = Replace(strLine , Chr(155), " ")
strLine= Regex.Replace(strLine, "\c@", " ")
strLine= Regex.Replace(strLine, "\c_", " ")
strLine= Regex.Replace(strLine, "\c", " ")
strLine= Regex.Replace(strLine, "\cA", " ")
strLine= Regex.Replace(strLine, "\cZ", " ")

查阅ANSI转义码CSI序列相关章节后,不确定是否获取的十六进制编码有误,搜索许久未找到可行解决方案,咨询该字符的正确替换方法。

问题原因

你之前尝试匹配的单字节0x9B是8位C1控制字符集定义的CSI,但是目前绝大多数文本、终端场景使用的是7位兼容的双字节CSI格式:由转义字符ESC(ASCII码27,十六进制0x1B)后跟半角左中括号[(ASCII码91,十六进制0x5B)组成。你在Notepad++中看到的字符实际是ESC+[的双字节组合,不是单字节0x9B,所以之前匹配Chr(155)的写法完全命中不到目标字符。

正确替换方法
  • 基础替换(仅替换CSI起始标记,适配绝大多数常见场景):
' 匹配7位格式CSI起始标记并替换
strLine = strLine.Replace(Chr(27) & "[", " ")
  • 完整清理(兼容单/双字节两种CSI格式,一次性移除整个CSI转义序列,避免残留转义参数):
' 正则匹配所有完整CSI序列并替换
strLine = Regex.Replace(strLine, "(\x1B\[|\x9B)[\x20-\x3F]*[\x40-\x7E]", " ")

正则规则说明:

  • (\x1B\[|\x9B) 同时匹配两种CSI起始标记:双字节的ESC+[、单字节的0x9B
  • [\x20-\x3F]* 匹配CSI后跟随的参数内容(包含数字、分号等参数符号,范围为0x20-0x3F的ASCII字符)
  • [\x40-\x7E] 匹配CSI序列的终止字节(范围为0x40-0x7E的ASCII字符,标识整个转义序列结束)

如果替换后仍有残留,可以先将读取到的字符串逐字符转成十六进制编码打印,确认目标位置的实际字符值,即可100%避免编码误判问题。

内容的提问来源于stack exchange,提问作者shadow2020

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.13 16:15:55