空格的码值

怎么啦2022-07-06  14

异常数据跟踪

最近,发现数据库中的字段值数据异常。在业务场景中,这个字符串字段中不允许使用空网格,但是仍然可以找到一些数据 # 39;空格 # 39;经过反复验证,我发现我写的代码确实会修剪空网格。经过反复调试,发现代码没有问题,但是是什么让这些数据逃过了业务代码的验证呢?

准备破案。

难道我用肉眼看不见 # 39;空格 # 39;,不是我们通常看到或理解的 # 39;空格 # 39;?

带着这个问题,我搜索了相关问题,发现果然很多人都遇到过隐形人物C2 A0。那么这是什么性格呢?

打开UTF-8的编码表,找到相应的字符。

首先,明确C2 A0代表的编码序号是什么。显然,我们只需要将这个十六进制转换成十进制,即C2=194 A0=160。这对应于

U+00A0

194 160

不间断空格

一般来说空格的编码是32。

U+0020

32

空间

我们用代码模拟一下上面两个角色。

common 空网格的Unicode码位是U+0020,即32。

C2空格网的Unicode码位是U+00A0,即160。

找到原因后,我们试图摆脱C2 A0空晶格。

参见下面的源代码

包com . lingyejun . dating . chap 11;导入Java . nio . charset . standard charsets;导入Java . util . regex . matcher;导入Java . util . regex . pattern;public class special space { public static void main(String[]args){ String str 1 = # 34;凌晔君 # 34;;byte[]str 1 bytes = str 1 . getbytes();String space = new String(str 1 bytes,StandardCharsets。UTF _ 8);system . out . println( # 34;包含32个空格的字符串: # 34;+空格);system . out . println( # 34;修剪去掉32->:Space: # 34;+space . trim());byte[] str2Bytes =新字节[11];System.arraycopy(str1Bytes,0,str2Bytes,0,str 1 bytes . length);str2Bytes[9] =(字节)0xC2str2Bytes[10] =(字节)0xA0String noBreakSpace = new String(str 2 bytes,StandardCharsets。UTF _ 8);system . out . println( # 34;with c2a 0-->:不换行空格的字符串: # 34;+noBreakSpace);system . out . println( # 34;不能用trim->:NO-BREAK SPACE: # 34;删除c2a0+nobreakspace . trim());// 32就是我们平时说的空间空格->;SPACE byte[] bytes1 = new byte[]{(字节)0x 20 };String space1 =新字符串(字节1,标准字符集。UTF _ 8);system . out . println( # 34;UTF-8字符编码数字32->: 0x1F输出: # 34;+space 1);//0x C2 = 194 0xa 0 = 160- gt;不间断空格byte[]bytes 2 = new byte[]{(byte)0x C2,(byte)0xa 0 };String space2 =新字符串(bytes2,StandardCharsets。UTF _ 8);char[]chars 3 = space 2 . tochararray();system . out . println( # 34;UTF-8字符编码数字194->:0x C2 160->;0xA0输出: # 34;+space 2);byte[] bytes3 = new byte[]{(字节)0xC2,(字节)0xa 0 };String c2a0Space =新字符串(bytes3,StandardCharsets。UTF _ 8);pattern p = pattern . compile(c2a 0 space);Matcher m = nullm = p . matcher(noBreakSpace);noBreakSpace = m . replace all( # 34;#34;);system . out . println( # 34;使用正则化删除c2a 0-->:不换行空格: # 34;+noBreakSpace);}}

我是“叶琳君”。谢谢大家的喜欢、收藏和评论。下次见。​

转载请注明原文地址:https://juke.outofmemory.cn/read/623261.html

最新回复(0)