Cucumber feature文件添加# encoding: iso-8859-1后报错乱码问题
问题根因
从报错的包名io.cucumber.core.gherkin判断,你使用的是6.0及以上版本的Cucumber,该版本的Gherkin解析器有两个明确规则:
- 仅支持UTF-8编码的feature文件,早年Ruby版Cucumber遗留的
# encoding: xxx声明已经被完全废弃,添加这行不会触发解析器的编码切换逻辑。 - 语言声明
# language: fr必须能被解析器正确读取,才会加载法语对应的关键字映射(比如Fonctionnalité对应Feature、Scénario对应Scenario)。
你遇到的两个现象本质是同一个问题:
- 添加
# encoding: iso-8859-1时,你的文件实际存储为ISO-8859-1编码,解析器默认按UTF-8读取时,# language: fr行的字节解析异常,没有加载法语关键字包,因此把Fonctionnalité等合法法语关键字识别为非法内容,抛出解析异常。 - 去掉encoding头时,同样因为文件是ISO-8859-1编码,解析器按UTF-8读取重音字符时,字节序列不符合UTF-8规范,就会显示
�乱码。
解决步骤
- 删除feature文件顶部的
# encoding: iso-8859-1行,新版本Cucumber不需要任何编码声明。 - 把feature文件转存为无BOM的UTF-8编码,这是最核心的步骤:
- IntelliJ IDEA:点击右下角状态栏的编码选项,选择
UTF-8,弹出对话框时选择Convert(不要选Reload,Reload仅临时修改展示编码,不会修改文件存盘的编码格式) - VS Code:点击右下角状态栏的编码标识,选择
Save with Encoding,在弹出列表里选UTF-8(不要选UTF-8 with BOM) - Eclipse:右键点击feature文件,选择
Properties->Resource,在Text file encoding区域选择UTF-8,点击Apply保存
- IntelliJ IDEA:点击右下角状态栏的编码选项,选择
- 检查构建配置的全局编码,避免构建过程中把UTF-8的feature文件转成其他编码:
如果用Maven,在pom.xml中添加全局编码配置:
如果用Gradle,在build.gradle中添加配置:<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties>tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } - 清空构建缓存后重新运行测试:执行
mvn clean或gradle clean删除target/build目录下旧的缓存文件,避免之前ISO-8859-1编码的feature文件副本被加载。
验证标准
转码完成后,feature文件头部仅保留# language: fr即可,不需要其他额外配置:解析器可以正确识别所有法语关键字,测试运行时réunion这类重音字符可以正常显示,不会出现乱码或解析错误。
内容的提问来源于stack exchange,提问作者mma
相关产品推荐
相关产品推荐

