Groovy脚本西里尔字符输出异常问题求助
解决Groovy在Windows 10下西里尔字符输出异常的问题
问题背景
Windows 10 x64环境下,Groovy脚本输出西里尔字符时出现问号或乱码;开启「Beta:使用Unicode UTF-8提供全球语言支持」选项后,CMD/PowerShell可正常显示西里尔字符,但Groovy脚本仍异常;手动设置System.out为UTF-8输出后,内容变为乱码,相同环境下Python脚本无此问题。
有效解决方案
方案1:启动Groovy时指定JVM编码参数
运行脚本时,通过-Dfile.encoding=UTF-8强制JVM使用UTF-8编码处理控制台输出,直接匹配Windows UTF-8控制台的编码要求:
groovy -Dfile.encoding=UTF-8 your_script_name.groovy
如果是在IDE(如IntelliJ IDEA)中运行,需在Run Configuration的VM Options中添加:
-Dfile.encoding=UTF-8
方案2:在脚本中适配Windows控制台编码
若无法修改启动参数,可在脚本开头添加以下代码,确保输出流与Windows UTF-8控制台正确匹配:
import java.io.OutputStreamWriter import java.io.PrintWriter // 替换默认输出流为UTF-8编码的Writer,避免双重编码问题 def utf8Out = new PrintWriter(new OutputStreamWriter(System.out, "UTF-8"), true) System.out = utf8Out // 原脚本代码 def rusAlphabet = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ' def lowerCaseRusAlphabet = 'абвгдеёжзийклмнопрстуфхцшщъыьэюя' println(rusAlphabet) println(rusAlphabet.toLowerCase()) println(lowerCaseRusAlphabet)
问题原因说明
- Windows开启UTF-8 Beta选项后,控制台代码页变为65001(UTF-8),但Groovy依赖的JVM默认仍使用系统旧编码(如CP1251或GBK)处理字符串输出,编码不匹配导致字符显示为问号。
- 直接替换
System.out为UTF-8 PrintStream时,若JVM未同步更新编码上下文,会出现双重编码(字符串先转默认编码字节,再被UTF-8 PrintStream二次转码),最终导致乱码。
内容的提问来源于stack exchange,提问作者mabes
相关产品推荐
相关产品推荐

