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

使用Apache StringUtils stripAccents()出现问号替代重音字符问题求助

解决Apache StringUtils.stripAccents()返回问号的问题

我之前在Scala 2.12.x版本里遇到过完全一样的问题!当时折腾了好一会儿才找到原因,给你几个排查和解决的方向:

1. 检查Apache Commons Lang的版本

首先确认你用的是不是Commons Lang 3.x版本。2.x版本的stripAccents()实现有很大局限,对很多Unicode重音字符(比如你用到的Á)处理不当,会直接把无法识别的字符替换成问号。如果还在使用2.x,赶紧升级到3.10+的版本,这个问题在3.x里已经修复了。

2. 确保字符串编码正确

如果升级版本后还是有问题,那大概率是输入字符串的编码出了问题。Scala的字符串默认是UTF-16,但如果你的字符串是从外部来源(比如文件、网络请求、数据库)读取的,可能因为编码不一致导致字符被损坏,stripAccents()自然无法正确解析。要确保读取和处理字符串时全程用UTF-8编码。

3. 用JDK自带的Normalizer替代(更可靠)

如果不想依赖Commons Lang,或者升级后还是有小问题,直接用JDK的Normalizer类来实现重音去除反而更稳定,代码也很简单:

import java.text.Normalizer
import java.text.Normalizer.Form

def customStripAccents(input: String): String = {
  // 把带重音的字符分解为基础字符+重音标记
  val normalized = Normalizer.normalize(input, Form.NFD)
  // 移除所有重音标记
  normalized.replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
}

// 测试一下
println(customStripAccents("Ádám")) // 会输出 Adam

这个方法的原理是利用Unicode的规范化分解,把每个带重音的字符拆成基础字母和独立的重音符号,然后用正则把所有重音符号删掉,效果比旧版的stripAccents()靠谱多了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:12:09