使用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
相关产品推荐
相关产品推荐

