在 JMeter 中通过 BeanShell 写入 CSV 文件时,如果出现中文乱码问题,通常是因为文件编码不匹配。默认情况下,FileWriter
使用的是系统默认编码(可能是 ISO-8859-1
或其他非 UTF-8 编码),而中文字符需要 UTF-8 编码才能正确显示。
以下是解决中文乱码问题的方法:
方法 1:使用 OutputStreamWriter
并指定 UTF-8 编码
将 FileWriter
替换为 OutputStreamWriter
,并显式指定编码为 UTF-8
。
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.IOException;
// 定义 CSV 文件路径
String csvFilePath = "C:/path/to/your/output.csv";
// 定义要写入的数据(包含中文)
String dataToWrite = "列1,列2,列3\n值1,值2,值3";
// 使用 OutputStreamWriter 并指定 UTF-8 编码
OutputStreamWriter fileWriter = null;
try {
fileWriter = new OutputStreamWriter(new FileOutputStream(csvFilePath, true), "UTF-8"); // true 表示追加模式
fileWriter.write(dataToWrite + "\n");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
方法 2:添加 BOM(字节顺序标记)以确保 UTF-8 编码
某些工具(如 Excel)在打开 CSV 文件时,可能需要 BOM 来正确识别 UTF-8 编码。你可以在文件开头写入 BOM。
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.IOException;
// 定义 CSV 文件路径
String csvFilePath = "C:/path/to/your/output.csv";
// 定义要写入的数据(包含中文)
String dataToWrite = "列1,列2,列3\n值1,值2,值3";
// 使用 OutputStreamWriter 并指定 UTF-8 编码
OutputStreamWriter fileWriter = null;
try {
fileWriter = new OutputStreamWriter(new FileOutputStream(csvFilePath, true), "UTF-8");
// 如果是新文件,写入 BOM
if (new File(csvFilePath).length() == 0) {
fileWriter.write('\uFEFF'); // UTF-8 BOM
}
fileWriter.write(dataToWrite + "\n");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
方法 3:使用第三方库(如 OpenCSV)
如果你需要更复杂的 CSV 写入操作,可以使用第三方库(如 OpenCSV)。首先需要将 OpenCSV 的 JAR 文件添加到 JMeter 的 lib
目录中,然后使用以下脚本:
import com.opencsv.CSVWriter;
import java.io.FileWriter;
import java.io.IOException;
// 定义 CSV 文件路径
String csvFilePath = "C:/path/to/your/output.csv";
// 定义要写入的数据(包含中文)
String[] header = {"列1", "列2", "列3"};
String[] row = {"值1", "值2", "值3"};
// 使用 OpenCSV 写入 CSV 文件
CSVWriter csvWriter = null;
try {
csvWriter = new CSVWriter(new OutputStreamWriter(new FileOutputStream(csvFilePath, true), "UTF-8"));
// 如果是新文件,写入表头
if (new File(csvFilePath).length() == 0) {
csvWriter.writeNext(header);
}
// 写入数据行
csvWriter.writeNext(row);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (csvWriter != null) {
try {
csvWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
方法 4:确保 JMeter 脚本本身的编码为 UTF-8
如果 BeanShell 脚本中直接包含中文字符,确保 JMeter 的脚本文件保存为 UTF-8 编码:
- 打开 JMeter 的
jmeter.properties
文件。 - 找到
sampleresult.default.encoding
属性,将其设置为UTF-8
:sampleresult.default.encoding=UTF-8
- 保存并重启 JMeter。
总结
- 推荐使用 方法 1 或 方法 2,通过
OutputStreamWriter
指定 UTF-8 编码解决中文乱码问题。 - 如果需要更复杂的 CSV 操作,可以使用 方法 3(OpenCSV)。
- 确保 JMeter 脚本文件本身保存为 UTF-8 编码(方法 4)。