转义处理

commons.lang

StringEscapeUtils 处理字符转义与反转义

 

 

common.utils;

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;
import org.springframework.web.util.HtmlUtils;

public class StringUtilsTest {

    @Test
    public void test() {
        String str="你好呀,<input>这里真不错!";
        
//       ---JavaScript
//        String javascriptStr="<script>alert('你好111')</script>";
//    	System.out.println(StringEscapeUtils.escapeJavaScript(javascriptStr));
//    	System.out.println(StringEscapeUtils.unescapeJavaScript(javascriptStr));
        //输出 <script>alert(\'111\')</script>
//    	<script>alert('111')</script>
//        ----SQL
//        StringBuffer sql = new StringBuffer("select * from inf_moderator_info info  where 1=1  ");
//        if(!CommUtil.isEmpty(keyWord)){
//        String keyWord = " ' or 1=你好1 '";
//        String keyWord = "很好%";
//        System.out.println(StringEscapeUtils.escapeSql(keyWord));
//        sql.append(" and info.introduction like '%" + StringEscapeUtils.escapeSql(keyWord) + "%'");
//        System.out.println(sql);
    	//输出 '' or 1=1 ''
    	
//    	--html
//    	String html="<A>你好dddd</A>";
//    	System.out.println(StringEscapeUtils.escapeHtml(html));
//    	System.out.println(StringEscapeUtils.unescapeHtml(html));
    	
//    	--escapeJava/unescapeJava 把字符串转为unicode编码
//    	String java="你好dddd";
//    	System.out.println(StringEscapeUtils.escapeJava(java));
//    	System.out.println(StringEscapeUtils.unescapeJava(java));
//        \u4F60\u597Ddddd
//        你好dddd
    	
//    	String xml="你好dddd";
//    	System.out.println(StringEscapeUtils.escapeXml(xml));
//    	System.out.println(StringEscapeUtils.unescapeXml(xml));
//    	&#20320;&#22909;dddd
//        你好dddd
        
        
    	String a = "<html>吃饭</html>' or 1=1 '<input></input>";
		System.out.println(StringEscapeUtils.escapeHtml(a));
//		a=StringEscapeUtils.escapeHtml(a);
//		System.out.println(StringEscapeUtils.unescapeHtml(StringEscapeUtils.escapeHtml(a)));
//		System.out.println(HtmlUtils.htmlEscape(a));
		System.out.println(HtmlUtils.htmlUnescape(a));
		System.out.println(StringEscapeUtils.unescapeHtml(HtmlUtils.htmlEscape(a)));
		
//		&lt;html&gt;&#21507;&#39277;&lt;/html&gt;&lt;input&gt;&lt;/input&gt;
//		<html>吃饭</html><input></input>
//		&lt;html&gt;吃饭&lt;/html&gt;&lt;input&gt;&lt;/input&gt;
//		<html>吃饭</html><input></input>
		
		
//        System.out.println(escapeStr(str));
    } 
    public static String escapeStr(String str) {
		if (StringUtils.isEmpty(str)) {
			return "";
		}
		str = StringEscapeUtils.escapeSql(str);
		str = StringEscapeUtils.escapeHtml(str);
//		str = StringEscapeUtils.escapeJava(str);
//		str = StringEscapeUtils.escapeJavaScript(str);
		return str;
	}

	/**
	 * 字符反转义
	 * 
	 * @param str
	 * @return
	 */
	public static String unescapeStr(String str) {
		if (StringUtils.isEmpty(str)) {
			return "";
		}
		str = StringEscapeUtils.unescapeHtml(str);
		str = StringEscapeUtils.unescapeJava(str);
		str = StringEscapeUtils.unescapeJavaScript(str);
		return str;
	}
}

 

 

 

 

 

<think>好的,我现在需要帮助用户理解编程中的转义处理。首先,用户询问的是转义处理的定义和用途,以及常见用法。根据用户提供的引用内容,我需要综合这些信息,用中文组织一个结构清晰的回答,并生成相关问题。首先,定义部分。转义处理是什么?根据引用[1],转义字符是用来在字符串中插入特殊符号,处理换行、制表等需求的。所以,转义处理应该是通过转义字符来表示那些无法直接输入或具有特殊含义的字符。比如,\n代表换行,这在引用[2]和[4]都有提到。接下来是用途。用户可能需要知道为什么需要转义。引用[1]提到转义字符是操纵字符串的“秘密武器”,用于处理特殊符号和格式。引用[3]和[4]则讨论了在文件路径和正则表达式中使用反斜杠的情况,比如处理路径时避免转义错误,或者正则表达式中的特殊字符。因此,用途包括:插入特殊字符、处理文件路径、正则表达式中的元字符,以及多行字符串的拼接。 然后是常见用法。这里需要分点说明。根据引用[1]和[2],常见转义字符如\n、\t、\\、\"等,各自的作用。比如,\n换行,\t制表符,\\表示反斜杠本身,\"在字符串中插入引号。引用[4]提到原始字符串通过r前缀禁用转义,这在处理文件路径时很有用,比如r"C:\Users\file.txt"。此外,引用[3]提到反斜杠作为续行符,用于代码中换行而不影响字符串连续性,例如长字符串的分行书写。 需要注意,用户可能容易混淆的地方,比如文件路径中的正反斜杠。在Python中,引用[4]指出使用原始字符串或双反斜杠来避免转义问题。例如,路径"C:\\Users\\file.txt"或r"C:\Users\file.txt"。 此外,引用[3]提到正则表达式中也需要转义处理,比如匹配反斜杠本身需要使用\\\\,因为正则和字符串各自都需要转义。这部分可能需要举例说明,比如re.compile(r"\\d+")匹配\d+。最后,生成相关问题。要围绕转义处理的定义、常见转义字符、原始字符串的作用、文件路径处理、正则表达式中的转义,以及不同语言中的差异来提问。例如,如何避免转义字符的影响?在不同编程语言中转义处理有何不同?需要确保回答结构清晰,分点说明,并引用提供的资料。同时检查LaTeX格式是否正确,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能用不到数学公式,所以可能不需要。但如果有提到正则表达式中的模式,可能需要用代码块展示。 总结,回答的结构应该是:定义、用途、常见用法(分点),然后相关问题。确保每个部分都有引用支持,并自然地添加引用标识,比如在提到转义字符时引用[1][2],原始字符串时引用[4],文件路径时引用[3][4]等。</think>### 转义处理的定义及用途 **转义处理**是编程中通过**转义字符**(以反斜杠 `\` 开头)将普通字符转换为特殊功能字符,或取消特殊字符原有含义的过程。它主要用于以下场景: 1. **表示不可见字符**:例如 `\n` 表示换行,`\t` 表示制表符[^2][^4]。 2. **插入特殊符号**:在字符串中使用引号或斜杠时需转义,如 `\"` 表示双引号,`\\` 表示单个反斜杠[^1][^3]。 3. **处理文件路径和正则表达式**:避免路径中的反斜杠被误解析,或正则表达式中的元字符(如 `\d` 匹配数字)[^3][^4]。 --- ### 常见用法及示例 #### 1. 基础转义字符 - `\n`:换行符 ```python print("Hello\nWorld") # 输出两行:Hello 和 World[^2] ``` - `\t`:制表符(缩进) - `\\`:表示单个反斜杠(如路径 `C:\\Users\\file.txt`)[^3]。 #### 2. 原始字符串(Raw String) 在字符串前加 `r` 或 `R` 前缀可禁用转义,常用于文件路径或正则表达式: ```python path = r"C:\Users\file.txt" # 无需转义反斜杠[^4] regex = r"\d+" # 匹配数字序列 ``` #### 3. 多行字符串拼接 使用反斜杠作为**续行符**,将代码换行而不影响字符串内容: ```python long_str = "This is a very long string that \ spans multiple lines in code." ``` #### 4. 正则表达式中的转义 匹配特殊字符时需双重转义: ```python import re pattern = re.compile(r"\\d+") # 匹配 "\d+" 字符串 ``` --- ### 常见误区 - **文件路径处理**:Windows 路径中应使用反斜杠,但需通过转义或原始字符串避免错误[^4]。 - **正则表达式**:需注意语言层和正则引擎层的双重转义(如 `\\d` 表示 `\d`)[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值