前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >淘宝API返回的空格trim()不掉,好着急好生气

淘宝API返回的空格trim()不掉,好着急好生气

作者头像
烟雨平生
发布2024-11-23 08:20:40
发布2024-11-23 08:20:40
9400
代码可运行
举报
文章被收录于专栏:数字化之路数字化之路
运行总次数:0
代码可运行

全角空格\u3000

  • 使用java.lang.String#trim不掉
  • 使用正则\s匹配不掉

怎么处理文末有

异常了:trim()后空格还在

有空格后,后面做数据库查询时就不好操作:

用like吧,查到的数据多了;

用=吧,匹配不上。谁知道前面有几个空格。

为什么会有空格呢?已经trim过了!

复现一下

淘宝API返回的数据有空格

复现了:trim()后,空格仍然在!!!

从界面上看,也是没有空格的:

真是醉了!!

不想求甚解,用正则replace下试试

工期催得紧,没时间研究这个。

用个正则替换试一试

代码语言:javascript
代码运行次数:0
复制
pictureCategory.getPictureCategoryName()
        .replaceAll("\\s","");

replaceAll后,空格仍然没有被替换掉

这个空格是个什么鬼东西?

话说,计算机上处理的任何字符都要经过编码/解码吧!

从编码的角度分析一下

要实现从 char 到 Byte的相互转换则必须编码 字符是怎么编码的? 编码(Encoding):信息从一种形式或格式转换为另一种形式或格式的过程。 唐成,计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题

char后面的数字就是这个字符的编码值。 譬如字符“L”的编码是76 唐成,干货|RedisTemplate调lua踩了个坑

那么本次的12288代表哪个字符呢?

这个看不懂?不要紧,遇到不决,可问baidu:

原来是全角空格!!!

原因清楚了:java.lang.String#trim只处理

代码语言:javascript
代码运行次数:0
复制
'\u0020' (the space character)

解决办法就是增加对全角空格\u3000的替换

代码语言:javascript
代码运行次数:0
复制
pictureCategory.getPictureCategoryName()
        .replaceAll("[\\s\u3000]+", "").trim();

现在还可以问AI,以kimi为例:

一查不知道,原来还有彩蛋:

代码语言:javascript
代码运行次数:0
复制
在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,加深下理解:

代码语言:javascript
代码运行次数:0
复制
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());
    }


}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 的数字化之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 异常了:trim()后空格还在
  • 复现一下
  • 不想求甚解,用正则replace下试试
  • 从编码的角度分析一下
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档