使用ROSUDA REngine从Java向R传递字符串出现编码乱码问题
问题分析与解决方案
乱码原因
你看到的ÿþ是UTF-16LE编码的字节顺序标记(BOM),说明字符串在从Java传入R的过程中编码处理不匹配:要么是从数据库读取字符串时保留了BOM,要么是JRI引擎在字符串传递时使用了错误的编码格式。
解决步骤
- 修正数据库字符串读取方式
直接使用rs.getString()可能导致驱动保留原始字节流中的BOM,改用字节流指定编码重新构造字符串:
// 替换原有的sampleCode = rs.getString("sampleCode"); byte[] bytes = rs.getBytes("sampleCode"); if (bytes != null) { // 跳过UTF-16LE的BOM(前两个字节0xFF 0xFE) int offset = 0; if (bytes.length >=2 && bytes[0] == (byte)0xFF && bytes[1] == (byte)0xFE) { offset = 2; } sampleCode = new String(bytes, offset, bytes.length - offset, "UTF-8"); }
- 指定R引擎的编码
启动JRI引擎时明确指定编码参数,确保和Java端编码一致:
// 修改引擎启动代码,添加--encoding参数 engine = REngine.engineForClass("org.rosuda.REngine.JRI.JRIEngine", new String[] {"-no-save", "--encoding=UTF-8"}, new REngineStdOutput(), false);
同时在R代码开头设置全局编码:
engine.parseAndEval("options(encoding='UTF-8')");
- 修正代码笔误
你最后执行的R代码中print(df_lab$HGS[1]),但构造DataFrame时并没有HGS列,这会引发错误,建议删除或修正该语句。
内容的提问来源于stack exchange,提问作者Abdelilah El-Hadad
相关产品推荐
相关产品推荐

