工作笔记中非打印ASCII字符替换失效问题求助
问题:无法替换工作笔记中的非打印ASCII控制字符(如Escape 0x1B)
我尝试向工作笔记中添加包含非打印ASCII控制字符的文本,但这些字符在存入数据库前没有按预期完成替换。工作笔记里显示的方块就是实际的非打印字符,但在文本框中无法直接显示。
原始工作笔记内容:
TEST X 000 000 0x00 00000000 NUL (Null char.) 001 001 0x01 00000001 SOH (Start of Header) 002 002 0x02 00000010 STX (Start of Text) 003 003 0x03 00000011 ETX (End of Text) 004 004 0x04 00000100 EOT (End of Transmission) 005 005 0x05 00000101 ENQ (Enquiry) 006 006 0x06 00000110 ACK (Acknowledgment) 007 007 0x07 00000111 BEL (Bell) 008 010 0x08 00001000 BS (Backspace) 009 011 0x09 00001001 HT (Horizontal Tab) 010 012 0x0A 00001010 LF (Line Feed) 011 013 0x0B 00001011 VT (Vertical Tab) 012 014 0x0C 00001100 FF (Form Feed) 013 015 0x0D 00001101 CR (Carriage Return) 014 016 0x0E 00001110 SO (Shift Out) 015 017 0x0F 00001111 SI (Shift In) 016 020 0x10 00010000 DLE (Data Link Escape) 017 021 0x11 00010001 DC1 (XON)(Device Control 1) 018 022 0x12 00010010 DC2 (Device Control 2) 019 023 0x13 00010011 DC3 (XOFF)(Device Control 3) 020 024 0x14 00010100 DC4 (Device Control 4) 021 025 0x15 00010101 NAK (Negative Acknowledgement) 022 026 0x16 00010110 SYN (Synchronous Idle) 023 027 0x17 00010111 ETB (End of Trans. Block) 024 030 0x18 00011000 CAN (Cancel) 025 031 0x19 00011001 EM (End of Medium) 026 032 0x1A 00011010 SUB (Substitute) 027 033 0x1B 00011011 ESC (Escape) 028 034 0x1C 00011100 FS (File Separator) 029 035 0x1D 00011101 GS (Group Separator) 030 036 0x1E 00011110 RS (Request to Send)(Record Separator) 031 037 0x1F 00011111 US (Unit Separator)
我原本写了一段用于替换Escape字符的代码,但执行后发现只替换了字符串里的x1B子串,并没有替换实际的ASCII Escape控制字符(也就是工作笔记里显示为方块的0x1B字符):
/** * Escape a string for XML. * @param {String} txt * @return {String} */ ImDataHelper.escapeXml = function (txt) { var str = txt; // Replace the escape character. txt = str.replace(/x1B/g,''); // copied from SOAPMessage script include return Packages.org.apache.commons.lang.StringEscapeUtils.escapeXml(txt); };
执行后的输出:
2019-04-09 13:31:37 - Shaji Kalidasan (Work Notes) TEST X 000 000 0x00 00000000 NUL (Null char.) 001 001 0x01 00000001 SOH (Start of Header) 002 002 0x02 00000010 STX (Start of Text) 003 003 0x03 00000011 ETX (End of Text) 004 004 0x04 00000100 EOT (End of Transmission) 005 005 0x05 00000101 ENQ (Enquiry) 006 006 0x06 00000110 ACK (Acknowledgment) 007 007 0x07 00000111 BEL (Bell) 008 010 0x08 00001000 BS (Backspace) 009 011 0x09 00001001 HT (Horizontal Tab) 010 012 0x0A 00001010 LF (Line Feed) 011 013 0x0B 00001011 VT (Vertical Tab) 012 014 0x0C 00001100 FF (Form Feed) 013 015 0x0D 00001101 CR (Carriage Return) 014 016 0x0E 00001110 SO (Shift Out) 015 017 0x0F 00001111 SI (Shift In) 016 020 0x10 00010000 DLE (Data Link Escape) 017 021 0x11 00010001 DC1 (XON)(Device Control 1) 018 022 0x12 00010010 DC2 (Device Control 2) 019 023 0x13 00010011 DC3 (XOFF)(Device Control 3) 020 024 0x14 00010100 DC4 (Device Control 4) 021 025 0x15 00010101 NAK (Negative Acknowledgement) 022 026 0x16 00010110 SYN (Synchronous Idle) 023 027 0x17 00010111 ETB (End of Trans. Block) 024 030 0x18 00011000 CAN (Cancel) 025 031 0x19 00011001 EM (End of Medium) 026 032 0x1A 00011010 SUB (Substitute) 027 033 0 00011011 ESC (Escape) 028 034 0x1C 00011100 FS (File Separator) 029 035 0x1D 00011101 GS (Group Separator) 030 036 0x1E 00011110 RS (Request to Send)(Record Separator) 031 037 0x1F 00011111 US (Unit Separator)
问题根源
你的正则表达式/x1B/g匹配的是字符串字面量的"x1B",而不是实际的ASCII控制字符(Unicode编码为\u001B,对应十六进制0x1B)。
修复方案
要匹配并替换实际的Escape控制字符,需要在正则表达式中使用Unicode转义序列\u001B,或者十六进制转义\x1B(注意是反斜杠开头)。如果需要替换所有非打印ASCII控制字符(0x00到0x1F),可以用一个范围匹配的正则表达式。
方案1:仅替换Escape字符(0x1B)
修改你的替换逻辑,把匹配的正则改成/\u001B/g或者/\x1B/g:
ImDataHelper.escapeXml = function (txt) { var str = txt; // 替换实际的ASCII Escape控制字符(0x1B) txt = str.replace(/\u001B/g,''); return Packages.org.apache.commons.lang.StringEscapeUtils.escapeXml(txt); };
方案2:替换所有非打印ASCII控制字符(0x00-0x1F)
如果需要一次性清理所有非打印的ASCII控制字符(包括NUL、SOH、STX等),可以使用范围匹配的正则:
ImDataHelper.escapeXml = function (txt) { var str = txt; // 匹配所有ASCII控制字符(0x00到0x1F)并替换为空 txt = str.replace(/[\x00-\x1F]/g,''); return Packages.org.apache.commons.lang.StringEscapeUtils.escapeXml(txt); };
验证效果
修改后执行代码,工作笔记里的方块(非打印控制字符)会被正确移除,不会再出现仅替换字符串字面量的情况。比如原来对应Escape字符的位置会被清空,所有非打印控制字符都不会再出现在最终的工作笔记中。
内容的提问来源于stack exchange,提问作者Shaji Kalidasan
相关产品推荐
相关产品推荐

