Android应用中如何检测字符串语言及编程判断单词是否为英文
在Android中检测字符串语言与判断英文单词的方法
嘿,我来帮你搞定这两个问题!先说说你之前尝试的Locale.getDefault().getDisplayLanguage().equals()——这个其实是获取系统默认的语言设置,没法检测任意字符串的实际语言,所以得用专门的方法。
一、检测任意字符串的语言
Android提供了几种靠谱的方式,根据你的API兼容需求来选:
1. 用系统TextClassifier(API 26+,推荐)
Android 8.0及以上的系统自带了TextClassifier,可以精准检测文本语言,还能处理多语言混合的情况:
Kotlin代码:
import android.view.textclassifier.TextClassifier import java.util.Locale fun detectTextLanguage(text: String): String? { val textClassifier = TextClassifier.getDefaultInstance() val detectionResult = textClassifier.detectLanguage( TextClassifier.Request.Builder(text).build() ) // 取置信度最高的语言标签,转成易读的语言名称 return detectionResult.languageTags.firstOrNull()?.let { Locale.forLanguageTag(it).displayName } }
Java代码:
import android.view.textclassifier.TextClassifier; import java.util.Locale; public String detectTextLanguage(String text) { TextClassifier textClassifier = TextClassifier.getDefaultInstance(); TextClassifier.Result detectionResult = textClassifier.detectLanguage( new TextClassifier.Request.Builder(text).build() ); if (!detectionResult.getLanguageTags().isEmpty()) { String languageTag = detectionResult.getLanguageTags().get(0); return new Locale.Builder().setLanguageTag(languageTag).build().getDisplayName(); } return null; }
2. 兼容低版本(API 24+):用ICU LanguageDetector
如果需要支持Android 7.0及以上,可以用android.icu.text.LanguageDetector:
import android.icu.text.LanguageDetector import android.icu.text.LanguageDetector.DetectorCallback fun detectLanguageForLowerApi(text: String): String? { val detector = LanguageDetector.getInstance() var detectedLang: String? = null detector.detect(text, object : DetectorCallback { override fun onLanguageDetected(language: String) { detectedLang = language } }) return detectedLang?.let { Locale.forLanguageTag(it).displayName } }
3. 第三方库(兼容更低版本)
如果要支持API 24以下,可以用开源库language-detector,在build.gradle添加依赖:
implementation 'com.optimaize.languagedetector:language-detector:0.6'
然后按照库的文档调用即可。
二、判断某个单词是否为英文单词
分两种场景:只是判断字符是否为英文,还是判断是否是真实存在的英文单词。
1. 仅判断字符是否为英文(正则表达式)
如果只是检查单词是否由英文字母组成,用正则就足够了:
Kotlin代码:
fun isEnglishCharSequence(word: String): Boolean { // 匹配大小写英文字母,支持带连字符的单词比如"mother-in-law"可以调整正则 return word.matches(Regex("^[a-zA-Z-]+$")) }
Java代码:
public boolean isEnglishCharSequence(String word) { return word.matches("^[a-zA-Z-]+$"); }
2. 判断是否为真实存在的英文单词
如果要确认单词是真实的英文词汇,可以用系统的拼写检查服务,或者嵌入本地字典:
方法A:用系统SpellCheckerSession
Android自带拼写检查功能,需要在Manifest中添加权限(如果需要在线检查):
<uses-permission android:name="android.permission.INTERNET" />
然后实现检查逻辑:
Kotlin代码:
import android.content.Context import android.view.textservice.SentenceSuggestionsInfo import android.view.textservice.SpellCheckerManager import android.view.textservice.SpellCheckerSession import android.view.textservice.SuggestionsInfo class EnglishWordChecker(private val context: Context) { private var spellCheckerSession: SpellCheckerSession? = null private var resultCallback: ((Boolean) -> Unit)? = null fun checkIfRealEnglishWord(word: String, onResult: (Boolean) -> Unit) { resultCallback = onResult val spellChecker = SpellCheckerManager.getSpellChecker(context) spellChecker ?: run { onResult(false) return } val sessionListener = object : SpellCheckerSession.SpellCheckerSessionListener { override fun onGetSuggestions(results: Array<SuggestionsInfo>?) { results?.firstOrNull()?.let { info -> // RESULT_NO_ERROR表示单词拼写正确,是真实英文单词 val isRealWord = info.resultCode == SuggestionsInfo.RESULT_NO_ERROR resultCallback?.invoke(isRealWord) } ?: resultCallback?.invoke(false) spellCheckerSession?.close() spellCheckerSession = null } override fun onGetSentenceSuggestions(results: Array<SentenceSuggestionsInfo>?) { // 单个单词检查不需要处理这个回调 } } spellCheckerSession = SpellCheckerSession( context, null, spellChecker, true, sessionListener ) spellCheckerSession?.getSuggestions(arrayOf(word), 1) } }
使用方式:
val checker = EnglishWordChecker(context) checker.checkIfRealEnglishWord("hello") { isReal -> if (isReal) { // 是真实英文单词 } else { // 不是 } }
方法B:本地字典检查
如果担心系统拼写检查不可靠,可以把常用英文单词放在一个文本文件里(比如words.txt),打包到assets中,然后加载到HashSet里,直接判断是否存在:
import android.content.Context import java.io.BufferedReader import java.io.InputStreamReader class LocalWordDictionary(context: Context) { private val englishWords = HashSet<String>() init { try { context.assets.open("words.txt").use { inputStream -> BufferedReader(InputStreamReader(inputStream)).useLines { lines -> lines.forEach { word -> englishWords.add(word.lowercase()) } } } } catch (e: Exception) { e.printStackTrace() } } fun isRealEnglishWord(word: String): Boolean { return englishWords.contains(word.lowercase()) } }
内容的提问来源于stack exchange,提问作者itcnuggets
相关产品推荐
相关产品推荐

