You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java替换未知字符:网站传至REST API文本含控制字符致JSON解析崩溃

这种情况我之前处理过好几次,那些看起来一样但编码不同的不可见字符确实坑人!核心问题是你不能一刀切替换所有非ASCII,得精准定位那些不可打印/控制类的Unicode字符,同时保留正常的非ASCII文本(比如中文、特殊符号)。下面给你几个实用的解决思路:

1. 先精准识别问题字符的编码

首先得搞清楚这些捣乱字符到底是什么Unicode码点,别光看显示效果。比如用Python的话,你可以把文本里的每个字符转成码点输出:

text = "你要处理的网站文本"
for char in text:
    print(f"'{char}' -> U+{ord(char):04X}")

这样就能看到具体的问题码点了——比如�是U+0000,常见的坑还有U+200B(零宽度空格)、U+FEFF(字节顺序标记)、U+0001到U+001F这类控制字符,甚至是U+200C、U+200D这类零宽度连接符。

2. 针对性过滤或替换

根据识别出的情况,选合适的处理方式:

  • 方案一:保留可打印字符,过滤控制字符
    用字符的可打印属性判断,同时可以手动保留换行、制表符这类需要的格式字符:
    cleaned_text = ''.join([c for c in text if c.isprintable() or c in '\n\t'])
    
  • 方案二:精准拉黑已知问题码点
    如果你已经拿到了问题字符的码点,直接构建黑名单过滤:
    bad_chars = {'\u0000', '\u200B', '\uFEFF', '\u0001'}  # 把你找到的码点都加进来
    cleaned_text = ''.join([c for c in text if c not in bad_chars])
    
  • 方案三:用正则批量匹配控制字符
    正则里的\p{C}可以匹配所有Unicode控制字符(包括各种不可见的),Python里直接用就行:
    import re
    cleaned_text = re.sub(r'\p{C}', '', text)
    
    这个方法能一次性清理绝大多数不可见控制字符,还不会误删正常的非ASCII内容。

3. API请求前的额外防护

  • 做一次Unicode规范化,把不同编码的“同显示”字符统一成一种形式,避免因为编码差异导致的解析问题:
    import unicodedata
    normalized_text = unicodedata.normalize('NFC', text)
    cleaned_text = re.sub(r'\p{C}', '', normalized_text)
    
  • 发送请求时务必指定UTF-8编码,比如Python里设置请求头:
    headers={'Content-Type': 'application/json; charset=utf-8'}
    

先定位问题字符的具体编码,再选合适的过滤方式,别直接替换所有非ASCII——那样会误杀很多正常内容。试试上面的方法,应该能解决程序崩溃的问题。

内容的提问来源于stack exchange,提问作者Tryliom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:59:18