全角空格\u3000
怎么处理文末有
有空格后,后面做数据库查询时就不好操作:
用like吧,查到的数据多了;
用=吧,匹配不上。谁知道前面有几个空格。
为什么会有空格呢?已经trim过了!
淘宝API返回的数据有空格
复现了:trim()后,空格仍然在!!!
从界面上看,也是没有空格的:
真是醉了!!
工期催得紧,没时间研究这个。
用个正则替换试一试
pictureCategory.getPictureCategoryName()
.replaceAll("\\s","");
replaceAll后,空格仍然没有被替换掉
这个空格是个什么鬼东西?
话说,计算机上处理的任何字符都要经过编码/解码吧!
要实现从 char 到 Byte的相互转换则必须编码 字符是怎么编码的? 编码(Encoding):信息从一种形式或格式转换为另一种形式或格式的过程。 唐成,计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题
char后面的数字就是这个字符的编码值。 譬如字符“L”的编码是76 唐成,干货|RedisTemplate调lua踩了个坑
那么本次的12288代表哪个字符呢?
这个看不懂?不要紧,遇到不决,可问baidu:
原来是全角空格!!!
原因清楚了:java.lang.String#trim只处理
'\u0020' (the space character)
解决办法就是增加对全角空格\u3000的替换
pictureCategory.getPictureCategoryName()
.replaceAll("[\\s\u3000]+", "").trim();
现在还可以问AI,以kimi为例:
一查不知道,原来还有彩蛋:
在Unicode标准中,定义了多种空格字符,用于不同的语言和格式。以下是一些常见的空格字符及其Unicode编码:
普通空格 (Space)
Unicode: U+0020
Description: 标准半角空格。
不间断空格 (Non-breaking Space)
Unicode: U+00A0
Description: 用于保持文本中单词之间的空格不被断开。
全角空格 (Full-width Space)
Unicode: U+3000
Description: 用于东亚文字,与全角字符宽度相同。
零宽度空格 (Zero Width Space)
Unicode: U+200B
Description: 用于控制文本布局,不可见。
零宽度非换行空格 (Zero Width No-break Space)
Unicode: U+FEFF
Description: 也称为字节顺序标记(Byte Order Mark, BOM),在文本流的开始处使用。
零宽度连字 (Zero Width Joiner)
Unicode: U+200D
Description: 用于连接某些字符,如阿拉伯文字。
空格 (Space)
Unicode: U+1680
Description: 也称为Ogham空格标记,用于Ogham脚本。
窄空格 (Narrow No-Break Space)
Unicode: U+202F
Description: 比普通空格窄,不换行。
半角空格 (Medium Mathematical Space)
Unicode: U+205F
Description: 用于数学公式,比普通空格宽。
六分空格 (Six-per-em Space)
Unicode: U+2002
Description: 约等于半个普通空格的宽度。
四分空格 (Four-per-em Space)
Unicode: U+2005
Description: 约等于四分之一个普通空格的宽度。
数字空格 (Figure Space)
Unicode: U+2007
Description: 用于数字之间的空格,与数字宽度相同。
这些空格字符在文本处理和排版中有着不同的用途。例如,不间断空格用于确保网址和电子邮件地址在文本中不被断开;全角空格则用于匹配日文、中文等语言中的全角字符宽度。
在处理文本数据时,经常会遇到不同类型的空格字符。除了最常见的半角空格(ASCII码为32)之外,还有全角空格(Unicode编码为\u3000)。这两种空格虽然在视觉上看起来相同,但在计算机内部表示却不一样,因此在进行字符串处理时需要注意区分。
正则中的\s可以匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v],但不包含全角空格。
最后再来看看全角空格和半角空格的编码:
全角空格【中文空格】,Unicode的编码为\u3000,转换为10进制为12288 半角空格【英文空格】,Unicode的编码为\u0020,转换为10进制为32
补充一个编码与字符之间转换的小Demo,加深下理解:
public class UnicodeToChar {
public static void main(String[] args) {
System.out.println();
// decode Unicode编码
decode(12288);
decode(80);
decode(67);
decode(31471);
decode(20);
}
private static void decode(int unicodeCode) {
char character = (char) unicodeCode;
System.out.println("Unicode编码 对应的字符是: ," + character + ", 十六进制编码值:" + Integer.toHexString(unicodeCode).toUpperCase() + " 十进制编码值:" + Integer.toString(unicodeCode).toUpperCase());
}
}