JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal continuation byte **

博客指出JNIEnv调用NewStringUTF(charStr)时,会校验charStr是否为标准UTF - 8格式字符串,若不符合会出现错误。给出两种解决方法,一是在调用前对charStr做UTF - 8校验,二是修改checkUtfBytes()方法,使其支持4字节以上UTF - 8字符串校验。

出现这个错误的原因是JNIEnv调用NewStringUTF(charStr)时,会校验charStr是否为标准的UTF-8格式字符串。

调用顺序:NewStringUTF() -> checkUtfString() -> checkUtfBytes()

解决方法有二:

方法一、在调用NewStringUTF(charStr)前,对参数charStr做UTF-8校验。

方法二、修改checkUtfBytes()方法,使其支持4字节以上UTF-8字符串校验。

 

当遇到 'input is not valid Modified UTF - 8: illegal continuation byte' 错误,这通常是因为输入的字符序列不符合 Modified UTF - 8 编码规则,Regular UTF - 8 合法的编码序列在 Modified UTF - 8 可能被视为非法的 [^2]。以下是一些可能的解决办法: #### 1. 检查数据源 确保输入的数据是合法的 UTF - 8 编码。数据可能在传输或存储过程中被损坏。例如,如果数据来自文件,可使用文本编辑器检查文件编码是否为 UTF - 8,或者使用工具验证文件的编码。 #### 2. 过滤非法字符 在处理数据前,对输入数据进行过滤,移除非法的 UTF - 8 字节序列。以下是一个 Java 示例代码,用于过滤非法 UTF - 8 字符: ```java import java.nio.charset.StandardCharsets; import java.util.regex.Pattern; public class UTF8Filter { private static final Pattern INVALID_UTF8 = Pattern.compile("[^\u0000-\uD7FF\uE000-\uFFFF]"); public static String filterInvalidUTF8(String input) { return INVALID_UTF8.matcher(input).replaceAll(""); } public static void main(String[] args) { String input = "包含非法 UTF - 8 字符的字符串"; String filtered = filterInvalidUTF8(input); System.out.println(filtered); } } ``` #### 3. 处理文件遍历问题 若在文件遍历过程中出现此错误,如 `file.listFiles` 方法调用时出错,可对文件路径和文件名进行编码转换或过滤。示例代码如下: ```java import java.io.File; import java.io.FilenameFilter; public class EssFileFilter implements FilenameFilter { private String[] types; public EssFileFilter(String[] types) { this.types = types; } @Override public boolean accept(File dir, String name) { try { // 过滤文件名中的非法字符 String filteredName = UTF8Filter.filterInvalidUTF8(name); for (String type : types) { if (filteredName.endsWith(type)) { return true; } } } catch (Exception e) { e.printStackTrace(); } return false; } } ``` #### 4. 检查 JNI 调用 在使用 JNI 调用时,确保传递给 JNI 函数的字符串是合法的 Modified UTF - 8 编码。若可能,在 Java 端对字符串进行预处理,确保传递合法字符串给 JNI 层。 #### 5. 编码转换 尝试将数据从其他编码转换为 UTF - 8。例如,若数据原本是 GBK 编码,可使用以下 Java 代码进行转换: ```java import java.nio.charset.Charset; public class EncodingConverter { public static String convertToUTF8(String input, String originalEncoding) { byte[] bytes = input.getBytes(Charset.forName(originalEncoding)); return new String(bytes, StandardCharsets.UTF_8); } public static void main(String[] args) { String input = "原始字符串"; String converted = convertToUTF8(input, "GBK"); System.out.println(converted); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Data-Mining

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值