shannonredeemed

Jmeter脚本 CSV文件参数读取乱码问题

前言

        Deep Seek 告诉我,99%的CSV乱码问题都能解决。重点检查 文件真实编码 和 CSV组件的显示编码设置。

踩坑之——配了[CSV文件参数]组件后,[调试取样器]读取的变量乱码

1、上配置

(1)创建CSV文件(由.xls文件重命名获得,注意这个地方),并在Jmeter脚本中进行【CSV数据文件配置】组件配置

image

  (2)添加【线程组】组件,且保持默认参数设置

image

   (3)使用【Java请求】组件(一个测试用组件)读取「测试案例」文件中的testPoint变量值

image

 

   (4)使用【BeanShell预处理】组件(前置处理器)设置同级各组件输出结果的编码格式

image

 

   (5)使用【调试取样器】读取每条测试案例的参数值

image

 

   (6)使用【察看结果树】组件查看脚本执行结果

image

 

 

2、看执行情况 - 从CSV读取到的数据全部乱码

image

 3、分析请教

 1 【Deep Seek 深情解答】
 2 您遇到的 CSV 变量乱码问题通常是由多个环节的编码设置不一致造成的。以下是系统化的解决方案:
 3 
 4 ### 问题根源分析
 5 1. **CSV 文件实际编码**:文件可能保存为 ANSI/GBK 而非 UTF-8
 6 2. **CSV 组件读取编码**:未显式指定读取编码
 7 3. **JMeter 变量处理**:变量在传递过程中编码不一致
 8 4. **调试取样器显示**:结果树未正确识别编码
 9 
10 ### 完整解决方案
11 
12 #### 第一步:确认并转换 CSV 文件编码
13 1. 用记事本打开 CSV 文件 → 另存为 → 选择 **UTF-8** 编码保存
14 ![另存为UTF-8](https://i.imgur.com/3WlzK9l.png)
15 2. 推荐使用专业工具验证:
16 ```bash
17 # 使用 file 命令检查编码 (Linux/Mac)
18 file -i your_data.csv
19 
20 # 预期输出:charset=utf-8
21 ```
22 
23 #### 第二步:正确配置 CSV 数据文件组件
24 在 CSV Data Set Config 中:
25 ```properties
26 Filename: /path/to/your_data.csv
27 File Encoding: UTF-8 # 必须显式设置
28 Variable Names: col1,col2
29 ```
30 ![CSV设置](https://jmeter.apache.org/images/screenshots/csv-data-set-config.png)
31 
32 #### 第三步:添加编码转换后置处理器 (JSR223 + Groovy)
33 在 HTTP 请求后添加 **JSR223 PostProcessor**:
34 ```groovy
35 // 强制转换所有CSV变量为UTF-8
36 vars.entrySet().each { entry ->
37 def rawValue = entry.getValue()
38 if (rawValue instanceof byte[]) {
39 vars.put(entry.getKey(), new String(rawValue, "UTF-8"))
40 } else {
41 // 处理字符串类型变量
42 byte[] bytes = rawValue.getBytes("ISO-8859-1") // 先转回原始字节
43 vars.put(entry.getKey(), new String(bytes, "UTF-8"))
44 }
45 }
46 ```
47 
48 #### 第四步:调试取样器显示优化
49 在 **View Results Tree** 中:
50 1. 选择调试取样器结果
51 2. 顶部下拉菜单选择 **UTF-8** 编码
52 ![编码选择](https://i.imgur.com/5aXJb9y.png)
53 
54 #### 第五步:JMeter 启动脚本永久设置 (推荐)
55 修改 `jmeter.bat`/`jmeter.sh` 启动脚本:
56 ```diff
57 # 在HEAP设置后添加编码参数
58 :SET_HEAP
59 set HEAP=-Xms1g -Xmx2g
60 + set JVM_ARGS=%JVM_ARGS% -Dfile.encoding=UTF-8
61 ```
62 
63 ### 验证流程
64 1. 添加 **Debug Sampler** 查看原始变量值
65 2. 在需要的位置添加以下代码打印日志:
66 ```groovy
67 // JSR223 Sampler 验证
68 log.info("=== CSV 变量验证 ===");
69 vars.entrySet().each {
70 log.info(it.getKey() + " = " + it.getValue());
71 }
72 ```
73 3. 检查控制台日志(日志本身需确保UTF-8输出)
74 
75 ### 常见陷阱排查
76 1. **BOM 头问题**:用 Notepad++ 打开 CSV → 编码 → 转为 UTF-8 无 BOM
77 2. **操作系统语言干扰**:
78 ```properties
79 # 在 user.properties 中添加
80 sampleresult.default.encoding=UTF-8
81 jsyntaxtextarea.encoding=UTF-8
82 ```
83 3. **数据库源数据问题**:如果 CSV 来自数据库,确保导出时指定 UTF-8
84 
85 ### 替代方案:使用函数转换
86 在需要的地方直接使用:
87 ```java
88 ${__changeEncoding(${your_var},ISO-8859-1,UTF-8)}
89 ```
90 
91 > 通过以上步骤,99% 的 CSV 乱码问题都能解决。重点检查 **文件真实编码** 和 **CSV组件的显式编码设置**,配合启动参数可彻底解决问题。

 4、调试&解决

        Jmeter脚本里,CSV和BeanShell组件里的编码格式排列组合后,仍然乱码,因此推测,问题还是出在CSV文件本身的真实编码上

(1) 尝试DS给的第一个方法 - 修改CSV文件的编码

—— 用记事本打开 CSV 文件 → 另存为 → 选择 **UTF-8** 编码保存,发现问题没有得到解决,且结果更糟糕了:

image

 

image

 

 

image

image

(2)重新创建.xls文件,并通过 文件->另存为 .csv文件的方式 —— 问题解决啦!!!

  ——回想了一下,这个CSV文件是由我创建的.xls文件经内容编辑后,重命名并修改后缀名得来的,可能问题就出在这里

image

 

image

 

image

image

 

 

image

(3)继续尝试 —— 将【CSV数据文件配置】配置中的“文件编码”改为“UTF-8”,发现,结果又乱码了

image

 

image

 

(4)甚至再继续将BeanShell中的编码格式改为 GBK也不好使 —— image

 

image

 

 

(5)将【CSV数据文件配置】配置中的“文件编码”改回“GBK”,再把BeanShell中的编码格式也改为 “GBK”怎么样呢 —— Okay的哟!!!

image

 

image

image

(6)将【CSV数据文件配置】配置中的“文件编码”改回“GBK”,直接把BeanShell组件删掉怎么样呢??? —— 竟然完全没问题!!!

 

image

 

 

总结

为确保Jmeter脚本中的引入的CSV参数文件内容读取不乱码,有以下关键操作及配置供参考——

1. CSV文件的创建,尽量采用如下步骤:新建excel工作表 -> 输入文件内容 -> 文件 -> 另存为 -> 选择.csv后缀格式文件;

2. Jmeter的【CSV数据文件配置】组件参数中“文件编码” ,尽量选择“GBK” (目前的验证结果,UTF-8 会导致读取乱码);

3. Jmeter脚本中,是否通过【BeanShell预处理程序】组件为请求组件设置编码格式,目前验证结果,没影响,所以宝子们可以随意啦!~ 

 

呛呛!~ 今天的Jmeter踩坑博客就到这里啦!~  日拱一卒,功不唐捐!~ 山遥路远,行则将至!~ 与亲爱、可爱的诸君共勉 ღ( ´・ᴗ・` )比心

 

下期预告

我们将 对 【CSV数据文件配置】CSV文件参数读取与【线程组】组件的线程数关系进行一番梳理!~

posted on 2025-08-10 18:51  Shannon_Zhang  阅读(146)  评论(0)    收藏  举报