VB中如何替换ASCII为155的Control Sequence Introducer控制字符
问题:无法替换字符串中的Control Sequence Introducer控制字符
花费一整天尝试替换从文件读取的字符串内的特殊字符,经检索确认该字符为Control Sequence Introducer(控制序列引入符,简称CSI)。查阅资料显示该字符十六进制编码为9B,对应ASCII编码为155。目前已经成功替换字符串中的空字符,但始终无法移除这个特殊字符。在Notepad++中开启「显示所有符号」功能后,该字符的显示效果参考截图:
已尝试以下多种替换方法,均未生效:
strLine = strLine.Replace(Chr(155), " ") strLine = Replace(strLine , "9B", " ") strLine = Replace(strLine , "›", " ") 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
相关产品推荐
相关产品推荐

