Scala中特殊编码字符转换咨询:变音符号与欧元符号处理
嘿,这个需求在Scala里完全能搞定!我给你分享两种实用方案,既能处理变音符号转成普通字母,也能把欧元符号替换成"Euro",直接上干货:
1. 处理变音符号(ä/ö/ü → a/o/u)
方案一:用Java原生工具类(无额外依赖)
Scala可以直接调用Java的Normalizer类,通过Unicode标准化来剥离变音符号,这是最省心的原生方案,不用装任何库:
import java.text.Normalizer def removeAccents(str: String): String = { Normalizer.normalize(str, Normalizer.Form.NFD) // 匹配所有组合变音符号并移除 .replaceAll("\\p{InCombiningDiacriticalMarks}+", "") }
原理是把带变音的字符(比如ö)分解成基础字符o加上单独的变音符号Unicode码,然后过滤掉这些变音符号,就得到了纯字母。
方案二:用第三方库(更简洁)
如果觉得原生写法有点啰嗦,可以用Apache Commons Lang3的StringUtils.stripAccents方法,一行搞定:
首先在你的SBT配置里加依赖:
libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.14.0"
然后代码里直接用:
import org.apache.commons.lang3.StringUtils val withoutAccents = StringUtils.stripAccents(str)
这个方法会自动处理所有带变音的字符,不止ä/ö/ü,其他语言的变音符号也能搞定。
2. 处理欧元符号(€ → "Euro")
这个就简单多了,直接用Scala字符串的replace或者replaceAll方法就行,甚至可以根据上下文调整:
// 直接替换所有€为"Euro "(加空格避免和后面的数字连在一起) val withEuroReplaced = str.replace("€", "Euro ")
如果需要更灵活的匹配(比如只替换独立的€,或者处理特殊格式),可以用正则,比如:
// 匹配€后面紧跟数字的情况,替换成"Euro " val withEuroReplaced = str.replaceAll("€(?=\\d)", "Euro ")
完整示例
把两个逻辑结合起来,处理你给的示例字符串:
import java.text.Normalizer def normalizeText(str: String): String = { // 第一步:移除变音符号 val withoutAccents = Normalizer.normalize(str, Normalizer.Form.NFD) .replaceAll("\\p{InCombiningDiacriticalMarks}+", "") // 第二步:替换欧元符号 withoutAccents.replace("€", "Euro ") } // 测试你的示例字符串 val originalStr = "Köln and München are great cities. The average bus ticket costs €4.5" val result = normalizeText(originalStr) // 输出:"Koln and Munchen are great cities. The average bus ticket costs Euro 4.5"
额外小提示
如果还有其他特殊符号需要处理(比如其他货币符号、特殊字符),可以扩展这个逻辑——要么用正则批量替换,要么用第三方库(比如Apache Commons Text)的工具类,都能轻松搞定。
内容的提问来源于stack exchange,提问作者jOasis
相关产品推荐
相关产品推荐

