整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

「Java工具类」Apache的StringEscapeUtils转义工具类

绍语

本号主要是Java常用关键技术点,通用工具类的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享;datax、kafka、flink等大数据处理框架的技术分享。文章会不断更新,欢迎码友关注点赞收藏转发!

望各位码友点击关注,冲1000粉。后面会录制一些视频教程,图文和视频结合,比如:图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱,码友们冲啊

如果码友觉得代码太长,可以从头到尾快速扫射一遍,了解大概即可。觉得有用后再转发收藏,以备不时之需。

正文:

Apache的StringEscapeUtils转义工具类,主要是针对html、json、xml、js等的转义。具体使用场景在项目中并不是很多,所以可能了解的人也比较少。

StringEscapeUtils转义例子

 import org.apache.commons.text.StringEscapeUtils;
 import org.junit.Test;
 
 public class StringEscapeUtilsTest {
 
     @Test
     public void test() {
         // 转义html脚本和反转义html脚本
         String inputText = "<input type=\"button\" value=\"点我\"/>";
         String s1 = StringEscapeUtils.escapeHtml4(inputText);
         System.out.println(s1);
         String s2 = StringEscapeUtils.unescapeHtml4(s1);
         System.out.println(s2);
 
         // 转义js脚本和反转义js脚本
         String s3 = StringEscapeUtils.escapeEcmaScript("<script>alert('点我')<script>");
         System.out.println(s3);
         String s4 = StringEscapeUtils.unescapeEcmaScript(s3);
         System.out.println(s4);
 
         // 把字符串转义为unicode编码和从把unicode编码转义为字符串
         String s5 = StringEscapeUtils.escapeJava("abc不要点我了");
         System.out.println(s5);
         String s6 = StringEscapeUtils.unescapeJava(s5);
         System.out.println(s6);
 
         // 转义XML和反转义XML
         String s7 = StringEscapeUtils.escapeXml11("<name>张三</name>");
         System.out.println(s7);
         String s8 = StringEscapeUtils.unescapeXml(s7);
         System.out.println(s8);
     }
 }

其他方法:


工具类源码:

直接引入工具类的jar包即可

 <dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-text</artifactId>
   <version>1.1</version>
 </dependency>

和本文使用的相同功能的工具类:

  • org.apache.commons.lang.StringEscapeUtils,与org.apache.commons.text.StringEscapeUtils工具类一样,但是apache把它注解为过时了,它还有个牛逼的方法就是转义sql【escapeSql】,但是建议使用本文使用的包;
<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>
  • org.springframework.web.util.HtmlUtils,spring的一个工具类,主要针对html,可以了解下;
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.3.6</version>
</dependency>
  • groovy.json.StringEscapeUtils,和org.apache.commons.text.StringEscapeUtils一样的功能,项目一般不用这个包,但是可以了解下;如果会groovy脚本的话应该用的就多,groovy-xxx有很多工具类的,但是我也没用过,感兴趣的可以探索下。
<dependency>
  <groupId>org.codehaus.groovy</groupId>
  <artifactId>groovy-all</artifactId>
  <version>3.0.9</version>
  <type>pom</type>
</dependency>

鄙人编码十年多,在项目中也积累了一些工具类,很多工具类在每个项目都有在用,很实用。大部分是鄙人封装的,有些工具类是同事封装的,有些工具类已经不记得是ctrl+c的还是自己封装的了,现在有空就会总结项目中大部分的工具类,分享给各位码友。如果文章中涉及的代码有侵权行为请通知鄙人处理。

计划是先把工具类整理出来,正所谓工欲善其事,必先利其器。项目中不管是普通单体项目还是多模块maven项目或是分布式微服务,一部分功能模块都是可以重用的,工具类模块就是其中之一。

们坚持使用 web 系统可以理解或不需要太多努力就能理解的特殊格式,而且对人类可读性特别有用的格式。每个都有各自的优缺点和适当的用例场景。

-- Tim Anderson

一段超级严肃的关于样本序列化的集合、子集和超集的文字

我是一名开发者,我读代码,我写代码,我写会写代码的代码,我写会写出供其它代码读的代码的代码。这些都非常火星语,但是有其美妙之处。然而,最后一点,写会写出供其它代码读的代码的代码,可以很快变得比这段文字更费解。有很多方法可以做到这一点。一种不那么复杂而且开发者社区最爱的方式是数据序列化。对于那些不了解我刚刚抛给你的时髦词的人,数据序列化是从一个系统获取一些信息,将其转换为其它系统可以读取的格式,然后将其传递给其它系统的过程。

虽然 数据序列化格式 多到可以埋葬哈利法塔,但它们大多分为两类:

  • 易于人类读写,
  • 易于机器读写。

很难两全其美,因为人类喜欢让我们更具表现力的松散类型和灵活格式标准,而机器倾向于被确切告知一切事情而没有二义性和细节缺失,并且认为“严格规范”才是它们最爱的口味。

由于我是一名 web 开发者,而且我们是一个创建网站的机构,我们将坚持使用 web 系统可以理解或不需要太多努力就能理解的特殊格式,而且对人类可读性特别有用的格式:XML、JSON、TOML、CSON 以及 YAML。每个都有各自的优缺点和适当的用例场景。

事实最先

回到互联网的早期, 一些非常聪明的家伙 决定整合一种让每个系统都能理解的标准语言,并创造性地将其命名为 标准通用标记语言(Standard Generalized Markup Language)(简称 SGML)。SGML 非常灵活,发布者也很好地定义了它。它成为了 XML、SVG 和 HTML 等语言之父。所有这三个都符合 SGML 规范,可是它们都是规则更严格、灵活性更少的子集。

最终,人们开始看到非常小、简洁、易读且易于生成的数据的好处,这些数据可以在系统之间以编程的方式共享,而开销很小。大约在那个时候,JSON 诞生了并且能够满足所有的需求。而另一方面,其它语言也开始出现以处理更多的专业用例,如 CSON,TOML 和 YAML。

XML:不行了

原本,XML 语言非常灵活且易于编写,但它的缺点是冗长,人类难以阅读、计算机非常难以读取,并且有很多语法对于传达信息并不是完全必要的。

今天,它在 web 上的数据序列化的用途已经消失了。除非你在编写 HTML 或者 SVG,否则你不太能在许多其它地方看到 XML。一些过时的系统今天仍在使用它,但是用它传递数据往往太重了。

我已经可以听到 XML 老爷爷开始在它们的石碑上乱写为什么 XML 是了不起的,所以我将提供一个小小的补充:XML 可以很容易地由系统和人读写。然而,真的,我的意思是荒谬的,很难创建一个可以规范的读取它的系统。这是一个简单美观的 XML 示例:

<book id="bk101">

<author>Gambardella, Matthew</author>

<title>XML Developer's Guide</title>

<genre>Computer</genre>

<price>44.95</price>

<publish_date>2000-10-01</publish_date>

<description>An in-depth look at creating applications

with XML.</description>

</book>

太棒了。易于阅读、理解、写入,也容易编码一个可以读写它的系统。但请考虑这个例子:

<!DOCTYPE r [ <!ENTITY y "a]>b"> ]>

<r>

<a b="&y;>" />

<![CDATA[[a>b <a>b <a]]>

<?x <a> <!-- <b> ?> c --> d

</r>

这上面是 100% 有效的 XML。几乎不可能阅读、理解或推理。编写可以使用和理解这个的代码将花费至少 36 根头发和 248 磅咖啡渣。我们没有那么多时间或咖啡,而且我们大多数老程序员们现在都是秃头。所以,让它活在我们的记忆里,就像 css hacks 、 IE 6 浏览器 和 真空管 一样好了。

JSON:并列聚会

好吧,我们都同意,XML = 差劲。那么,好的替代品是什么? JavaScript 对象表示法(JavaScript Object Notation),简称 JSON。JSON(读起来像 Jason 这个名字) 是 Brendan Eich 发明的,并且得到了伟大而强力的 JavaScript 意见领袖 Douglas Crockford 的推广。它现在几乎用在任何地方。这种格式很容易由人和机器编写,按规范中的严格规则 解析 也相当容易,并且灵活 —— 允许深层嵌套数据,支持所有的原始数据类型,及将集合解释为数组或对象。JSON 成为了将数据从一个系统传输到另一个系统的事实标准。几乎所有语言都有内置读写它的功能。

JSON语法很简单。方括号表示数组,花括号表示记录,由冒号分隔的两个值分别表示属性或“键”(在左边)、值(在右边)。所有键必须用双引号括起来:

{

"books": [

{

"id": "bk102",

"author": "Crockford, Douglas",

"title": "JavaScript: The Good Parts",

"genre": "Computer",

"price": 29.99,

"publish_date": "2008-05-01",

"description": "Unearthing the Excellence in JavaScript"

}

]

}

这对你来说应该是完全有意义的。它简洁明了,并且从 XML 中删除了大量额外废话,并传达相同数量的信息。JSON 现在是王道,本文剩下的部分会介绍其它语言格式,这些格式只不过是 JSON 的简化版,尝试让其更简洁或对人类更易读,可结构还是非常相似的。

TOML: 缩短到彻底的利他主义

TOML( Tom 的显而易见的最小化语言(Tom’s Obvious, Minimal Language))允许以相当快捷、简洁的方式定义深层嵌套的数据结构。名字中的 Tom 是指发明者 Tom Preston Werner ,他是一位活跃于我们行业的创造者和软件开发人员。与 JSON 相比,语法有点尴尬,更类似 ini 文件 。这不是一个糟糕的语法,但是需要一些时间适应。

[[books]]

id = 'bk101'

author = 'Crockford, Douglas'

title = 'JavaScript: The Good Parts'

genre = 'Computer'

price = 29.99

publish_date = 2008-05-01T00:00:00+00:00

description = 'Unearthing the Excellence in JavaScript'

TOML 中集成了一些很棒的功能,例如多行字符串、保留字符的自动转义、日期、时间、整数、浮点数、科学记数法和“表扩展”等数据类型。最后一点是特别的,是 TOML 如此简洁的原因:

[a.b.c]

d = 'Hello'

e = 'World'

以上扩展到以下内容:

{

"a": {

"b": {

"c": {

"d": "Hello"

"e": "World"

}

}

}

}

使用 TOML,你可以肯定在时间和文件长度上会节省不少。很少有系统使用它或非常类似的东西作为配置,这是它最大的缺点。根本没有很多语言或库可以用来解释 TOML。

CSON: 特定系统所包含的简单样本

首先,有两个 CSON 规范。 一个代表 CoffeeScript Object Notation,另一个代表 Cursive Script Object Notation。后者不经常使用,所以我们不会关注它。我们只关注 CoffeeScript。

CSON 需要一点介绍。首先,我们来谈谈 CoffeeScript。 CoffeeScript 是一种通过运行编译器生成 JavaScript 的语言。它允许你以更加简洁的语法编写 JavaScript 并 转译 成实际的 JavaScript,然后你可以在你的 web 应用程序中使用它。CoffeeScript 通过删除 JavaScript 中必需的许多额外语法,使编写 JavaScript 变得更容易。CoffeeScript 摆脱的一个大问题是花括号 —— 不需要它们。同样,CSON 是没有大括号的 JSON。它依赖于缩进来确定数据的层次结构。CSON 非常易于读写,并且通常比 JSON 需要更少的代码行,因为没有括号。

CSON 还提供一些 JSON 不提供的额外细节。多行字符串非常容易编写,你可以通过使用 # 符号开始一行来输入 注释 ,并且不需要用逗号分隔键值对。

books: [

id: 'bk102'

author: 'Crockford, Douglas'

title: 'JavaScript: The Good Parts'

genre: 'Computer'

price: 29.99

publish_date: '2008-05-01'

description: 'Unearthing the Excellence in JavaScript'

]

这是 CSON 的大问题。它是 CoffeScript 对象表示法(CoffeeScript Object Notation)。也就是说你要用 CoffeeScript 解析/标记化/lex/转译或其它方式来使用 CSON。CoffeeScript 是读取数据的系统。如果数据序列化的目的是允许数据从一个系统传递到另一个系统,这里我们有一个只能由单个系统读取的数据序列化格式,这使得它与防火火柴、防水海绵或者叉匙恼人的脆弱叉子部分一样有用。

如果这种格式被其它系统也采用,那它在开发者世界中可能非常有用。但到目前为止这基本上没有发生,所以在 PHP 或 JAVA 等替代语言中使用它是不行的。

YAML:年轻人的呼喊

开发人员感到高兴,因为 YAML 来自 一个 Python 的贡献者 。YAML 具有与 CSON 相同的功能集和类似的语法,有一系列新功能,以及几乎所有 web 编程语言都可用的解析器。它还有一些额外的功能,如循环引用、软包装、多行键、类型转换标签、二进制数据、对象合并和 集合映射 。它具有非常好的可读性和可写性,并且是 JSON 的超集,因此你可以在 YAML 中使用完全合格的 JSON 语法并且一切正常工作。你几乎不需要引号,它可以解释大多数基本数据类型(字符串、整数、浮点数、布尔值等)。

books:

- id: bk102

author: Crockford, Douglas

title: 'JavaScript: The Good Parts'

genre: Computer

price: 29.99

publish_date: !!str 2008-05-01

description: Unearthing the Excellence in JavaScript

业界的年轻人正在迅速采用 YAML 作为他们首选的数据序列化和系统配置格式。他们这样做很机智。YAML 具有像 CSON 一样简洁的所有好处,以及与 JSON 一样的数据类型解释的所有功能。YAML 像加拿大人容易相处一样容易阅读。

YAML 有两个问题,对我而言,第一个是大问题。在撰写本文时,YAML 解析器尚未内置于多种语言,因此你需要使用第三方库或扩展来为你选择的语言解析 .yaml 文件。这不是什么大问题,可似乎大多数为 YAML 创建解析器的开发人员都选择随机将“附加功能”放入解析器中。有些允许 标记化 ,有些允许 链引用 ,有些甚至允许内联计算。这一切都很好(某种意义上),只是这些功能都不是规范的一部分,因此很难在其他语言的其他解析器中找到。这导致系统限定,你最终遇到了与 CSON 相同的问题。如果你使用仅在一个解析器中找到的功能,则其他解析器将无法解释输入。大多数这些功能都是无意义的,不属于数据集,而是属于你的应用程序逻辑,因此最好简单地忽略它们和编写符合规范的 YAML。

第二个问题是很少有解析器完全实现规范。所有的基本要素都有,但是很难找到一些更复杂和更新的东西,比如软包装、文档标记和首选语言的循环引用。我还没有看到对这些东西的刚需,所以希望它们不让你很失望。考虑到上述情况,我倾向于保持 1.1 规范 中呈现的更成熟的功能集,而避免在 1.2 规范 中找到的新东西。然而,编程是一个不断发展的怪兽,所以当你读完这篇文章时,你或许就可以使用 1.2 规范了。

最终哲学

这是最后一段话。每个序列化语言都应该以个案标准的方式评价。当涉及机器的可读性时,有些 无出其右(the bee’s knees)。对于人类可读性,有些 名至实归(the cat’s meow),有些只是 金玉其外(gilded turds)。以下是最终细分:如果你要编写供其他代码阅读的代码,请使用 YAML。如果你正在编写能写出供其他代码读取的代码的代码,请使用 JSON。最后,如果你正在编写将代码转译为供其他代码读取的代码的代码,请重新考虑你的人生选择。


via: https://www.zionandzion.com/json-vs-xml-vs-toml-vs-cson-vs-yaml/

作者: Tim Anderson 选题: lujun9972 译者: GraveAccent 校对: wxy

本文由 LCTT 原创编译, Linux中国 荣誉推出

点击“了解更多”可访问文内链接

本文件的批量性操作,Excel催化剂已经有非常多的功能,常听说许多人对Excel催化剂的印象是功能太杂,但试问,不是活在真空世界中做数据分析,面对一大堆杂乱的数据环境,没有足够“杂”的功能来应付,真的可以称得上数据神器么?

本篇的两个小功能,处理下一般数据采集获取到的非理想文本数据:带unicode字符串的文本和带html特殊符号的文本。这些功能也是从实际需求中来。为了让数据处理更加得心应手,功能仍然不断新增。

网页采集数据常有的不完善

一、html编码问题

这里说的网页采集,当然可以最原始的从网页上复制粘贴回来的数据,更自动化的,就是使用网页采集工具批量性获取到的数据。

网页html文本,有转义字符如: <(小于号<) 、 >(大于号>) 、 (空格)等,这些因为html上有特定的含义,需要转义成其他输入字符。

更多的可见下文截图:


最终我们还原后,应该得到下面的文本才是想要的。

二、Unicode格式文本

我们采集到的数据中,可能会是以下展示的样式,非英文、数字的比如中文,用了Unicode字符表示(\u开头的)。


我们需要这样的格式,才是人阅读和使用的文本。

解决办法

既然这么大的共性情况,肯定是将它落实到功能上固化,有再次出现时可以立马解决,这就是Excel催化剂越来越“杂”的由来。

处理一个文件,你说在线转换下就可以,处理100个、1000个呢,还会这样去做吗?在Excel催化剂里,必然是批量性操作最佳使用场合。

自定义函数处理Excel单元格内容

如果数据已经落到Excel的单元格里,在做网页采集功能时,其实已经将此成套的网页采集相关会用到的功能都做成了自定义函数。

如下的将html的转义字符解码

同样地,Unicode字符串还原为原字符,也有自定义函数。

除此以外,还有大量的转换Utf8、从json提取、从xml提取指定元素、Url转码和还原等一大堆自定义函数。

上述自定义函数使用场景,数据源在Excel单元格或提取结果存储在Excel单元格,另如果是对整个文件的转换,就是本篇开发的两个小功能。

使用非常简单,选择一个或多个待转换的文本文件路径单元格,当只选择待转换时,转换后的结果覆盖原文件,选择两列时,右侧列为转换结果生成新文本,建议采用新生成文件方式。

任何覆盖原始文件的操作均有数据风险,无法恢复数据初始状态,不是一个好的科学的数据管理方式。

结语

小功能有大智慧,你能感受到了吗?盼望Excel催化剂的使用者,会因为其功能的不断新增而惊喜,因为又有新的繁琐操作被简单固化了。

看到小小的Excel催化剂包含这么多的功能,来应对各种数据采集、处理、分析各环节的痛点,希望催化剂的使用者们,都有慧眼,不用再相信培训机构所吹嘘的培训一小时,从此不加班的收割式的忽悠大法。

应对功能越来越多,请始终坚守最佳的Excel催化剂使用方法:搜索+笔记,用到时即搜即得,日常追更下文章。写文章者1小时,读文章者2分钟即可。