如何判断数字编码实体是否为有效的ISO8859-1编码?
判断HTML十进制字符引用有效性的Kotlin实现
你提到的〹属于HTML十进制字符引用,判断其是否为有效编码可按以下方案实现,无需引入额外依赖,直接使用Kotlin标准库内置的字符集处理API即可:
核心实现逻辑
- 第一步:通过正则匹配提取字符引用中的十进制码点数值,排除格式不符合的输入
- 第二步:校验码点是否在Unicode合法范围(0 ~ 0x10FFFF),超出范围直接判定为无效
- 第三步:将码点转换为字符后,用目标字符集做编码+解码的一致性校验,排除当前字符集不支持的码点
完整可运行代码
import java.nio.charset.Charset import java.nio.charset.CodingErrorAction /** * 判断HTML十进制字符引用是否为指定字符集的有效编码 * @param htmlEntity 格式为&#数字;的字符引用,示例:〹 * @param charset 目标校验字符集,默认使用UTF-8 * @return 有效返回true,无效返回false */ fun isValidHtmlEntity(htmlEntity: String, charset: Charset = Charsets.UTF_8): Boolean { // 匹配HTML十进制字符引用格式,提取码点数字 val entityRegex = Regex("^&#(\\d+);$") val matchResult = entityRegex.matchEntire(htmlEntity) ?: return false val codePoint = try { matchResult.groupValues[1].toInt() } catch (e: NumberFormatException) { return false } // 校验码点是否属于Unicode合法范围 if (codePoint < 0 || codePoint > 0x10FFFF) return false val originalStr = String(Character.toChars(codePoint)) // 配置编码/解码器,遇到错误直接抛出异常 val encoder = charset.newEncoder() .onMalformedInput(CodingErrorAction.REPORT) .onUnmappableCharacter(CodingErrorAction.REPORT) val decoder = charset.newDecoder() .onMalformedInput(CodingErrorAction.REPORT) .onUnmappableCharacter(CodingErrorAction.REPORT) return try { // 编码后再解码,和原字符串对比确认一致 val decodedStr = decoder.decode(encoder.encode(originalStr)).toString() originalStr == decodedStr } catch (e: Exception) { false } } // 测试用例 fun main() { println(isValidHtmlEntity("〹")) // 输出true,对应合法UTF-8字符〹 println(isValidHtmlEntity("�")) // 输出false,超出Unicode最大码点限制 println(isValidHtmlEntity("È", Charset.forName("US-ASCII"))) // 输出false,ASCII仅支持0-127的码点 }
扩展说明
如果需要校验十六进制格式的字符引用(如ሴ),只需要修改正则匹配规则为^&#x([0-9a-fA-F]+);$,再将提取的字符串按十六进制转Int即可。
内容的提问来源于stack exchange,提问作者mino monster
相关产品推荐
相关产品推荐

