当前位置: 首页 > news >正文

java 去掉 u00a0,UTF-8编码中的特殊空格之C2 A0 - NO-BREAK SPACE

异常数据追踪

最近发现数据库中的一个字段值数据异常的问题,业务场景中不允许这个字符串字段中出现空格,但是发现有部分数据依然有'空格',反复验证过之后发现自己写的代码的的确确会把空格trim掉,反复调试后发现代码没有问题,但是什么情况使得这些数据逃过了业务代码的校验?

准备破案

难道我肉眼看到的'空格',不是我们平常见到或者理解的'空格'?

带着这个疑问,我搜索了一下相关的问题,发现果不其然,很多人都遇到了C2 A0这个不可见字符,那么这个字符到底是什么呢?

首先明确C2 A0代表的编码序号是多少,很显然我们只需要将这个十六进制转为十进制,即C2=194 A0=160,这个在编码表中对应的是

bVbH47k

而我们一般意义上将的空格的编码是32

bVbH47a

那们我们通过代码来模拟一下上面两个字符

普通的空格 Unicode code point为U+0020即32

bVbH44w

C2 A0空格 Unicode code point为U+00A0即160

bVbH44r

找到原因之后,我们想办法把这种C2 A0空格给去除掉

源代码见下

package com.lingyejun.dating.chap11;

import java.nio.charset.StandardCharsets;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class SpecialSpace {

public static void main(String[] args) {

String str1 = "lingyejun ";

byte[] str1Bytes = str1.getBytes();

String space = new String(str1Bytes, StandardCharsets.UTF_8);

System.out.println("带有32 Space的字符串:" + space);

System.out.println("使用trim去掉32 -> Space:" + space.trim());

byte[] str2Bytes = new byte[11];

System.arraycopy(str1Bytes, 0, str2Bytes, 0, str1Bytes.length);

str2Bytes[9] = (byte) 0xC2;

str2Bytes[10] = (byte) 0xA0;

String noBreakSpace = new String(str2Bytes, StandardCharsets.UTF_8);

System.out.println("带有C2 A0 -> NO-BREAK SPACE的字符串:" + noBreakSpace);

System.out.println("使用trim无法去掉C2 A0 -> NO-BREAK SPACE:" + noBreakSpace.trim());

// 32为我们平常谈论的Space空格 -> SPACE

byte[] bytes1 = new byte[]{(byte) 0x20};

String space1 = new String(bytes1, StandardCharsets.UTF_8);

System.out.println("UTF-8 字符编码号32 -> 0x1F 输出:" + space1);

// 0xC2=194 0xA0=160 -> NO-BREAK SPACE

byte[] bytes2 = new byte[]{(byte) 0xC2, (byte) 0xA0};

String space2 = new String(bytes2, StandardCharsets.UTF_8);

char[] chars3 = space2.toCharArray();

System.out.println("UTF-8 字符编码号194 -> 0xC2 160 -> 0xA0 输出:" + space2);

byte[] bytes3 = new byte[]{(byte) 0xC2, (byte) 0xA0};

String c2a0Space = new String(bytes3, StandardCharsets.UTF_8);

Pattern p = Pattern.compile(c2a0Space);

Matcher m = null;

m = p.matcher(noBreakSpace);

noBreakSpace = m.replaceAll("");

System.out.println("使用正则去掉C2 A0 -> NO-BREAK SPACE:" + noBreakSpace);

}

}

如果对您有帮助,请不要忘了给翎野君点赞。

相关文章:

  • java里函数式表达式,Java8 Lambda表达式 和 函数式编程 原理详解
  • 易语言与php加密AES,易语言调用openssl库实现aes cbc/cfb 256加密
  • linux安装php json拓展,Linux PHP增加JSON支持
  • php ajax实现图片预览,ajax怎么实现图片的预览上传以及查看缩略图
  • php ajax筛选,ajax商品筛选功能怎么进行判断
  • php curl_init 报错,如何解决curl_init php报错问题
  • php ?page,google chrome浏览器下载 PHP通用分页类pagephp[仿google分页]
  • php curl ssl错误,php curl常见错误:SSL错误、bool(false)
  • win2008系统php伪静态,ZBlog PHP在WIN2008 64位系统不能伪静态的解决方法
  • 常用PHP命令,PHP 常用命令行
  • python爬虫怎么自动下载图片,【图文详解】python爬虫实战——5分钟做个图片自动下载器...
  • 立方体相册代码php,3D相册制作代码
  • oracle问题如何解决方案,oracle问题解决方案汇总
  • oracle+dbca+创建失败,oracle dbca启动图形不成功的处理方法
  • oracle 只读方式打开文件,OracleDataGuard_备库以只读或读写方式打开访问
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 3.7、@ResponseBody 和 @RestController
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • in typeof instanceof ===这些运算符有什么作用
  • Java,console输出实时的转向GUI textbox
  • js ES6 求数组的交集,并集,还有差集
  • nginx 配置多 域名 + 多 https
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 猴子数据域名防封接口降低小说被封的风险
  • 详解NodeJs流之一
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • ​批处理文件中的errorlevel用法
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #预处理和函数的对比以及条件编译
  • #在 README.md 中生成项目目录结构
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (二)构建dubbo分布式平台-平台功能导图
  • (二)正点原子I.MX6ULL u-boot移植
  • (转)http协议
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .dwp和.webpart的区别
  • .NET 中 GetProcess 相关方法的性能
  • .NET企业级应用架构设计系列之技术选型
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @Resource和@Autowired的区别
  • [ linux ] linux 命令英文全称及解释
  • [2023年]-hadoop面试真题(一)
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]
  • [Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb
  • [JS]JavaScript 注释 输入输出语句
  • [JS设计模式]Prototype Pattern