Encoding JMeter CSV数据集正在损坏存储为正确UTF-8的日语字符串,我得到了问号

Encoding JMeter CSV数据集正在损坏存储为正确UTF-8的日语字符串,我得到了问号,encoding,csv,utf-8,jmeter,Encoding,Csv,Utf 8,Jmeter,我从一个简单的文本文件中读取搜索词并发送到搜索引擎。 它的英文很好,但给了我????对于任何日语文本。 英文和日文混合的文本确实显示了英文文本,所以我知道它正在阅读 我看到的是: 输入文本: 雪豹をインストールする場合、新しい 变成: 雪豹 这是在HTTP的my POST字段中。 如果我将JMeter设置为对数据进行编码,它只会输入问号的百分比序列 关于数据: CSV文件在中非常简单 结构 只有一个字段/一列, 我将其命名为术语,后来用作 ${TERM} 我真的不需要完整的CSV,因为每行

我从一个简单的文本文件中读取搜索词并发送到搜索引擎。 它的英文很好,但给了我????对于任何日语文本。 英文和日文混合的文本确实显示了英文文本,所以我知道它正在阅读

我看到的是:

  • 输入文本: 雪豹をインストールする場合、新しい
  • 变成: 雪豹
这是在HTTP的my POST字段中。 如果我将JMeter设置为对数据进行编码,它只会输入问号的百分比序列

关于数据:

  • CSV文件在中非常简单 结构
  • 只有一个字段/一列, 我将其命名为术语,后来用作 ${TERM}
  • 我真的不需要完整的CSV,因为每行只有一个字符串
  • 没有逗号或引号
  • 它是UTF-8,当我在文件上运行Unix“file”命令时,它会显示UTF-8文本
  • 我还在两台机器上以命令行和图形模式验证了UTF-8
有趣的注意: 我注意到了一个有趣的巧合:如果有15个日文字符,那么我会得到15个问号,所以在某种程度上,它被视为完整字符,而不仅仅是字节

JMeter CSV数据集配置:

  • 文件名:japanese-searches.csv
  • 文件编码:UTF-8(也尝试不使用)
  • 变量名:术语
  • 分隔符:
  • 允许引用数据:False(我也尝试过True,不同,但仍然错误)
  • 在EOF回收:正确
  • 在EOF停止:False
  • 启动模式:所有线程
我试过几件事: -尝试允许引用数据。它变成了其他奇怪的角色。 -添加了-Dfile.encoding=UTF-8 -尝试对后期阶段进行编码,但它只是变成了一堆%nn的问号

我不确定在读取CSV的每一行之后如何“调试”。我想它马上就坏了,但我不确定

如果它只是在我引用它时被破坏了,那么除了${TERM}之外,可能还有其他一些“to bytes”函数调用。我会开始调查的。我还没有对JMeter函数做任何操作

12月24日编辑:

调整:

  • 更改了格式并添加了项目符号 为了更加清晰,我们需要考虑以下几点
  • 澄清文件为UTF-8,并已验证
新理论:

  • 有没有可能是日文字符通过了,问题是每个显示日文字符的地方都只在显示时将日文字符映射到一个“?”。所以,即使我检查了很多地方,它们都有一个显示问题只是在用户界面
  • JMeter中是否有方法查看字符或字符串的数值?实际上,告诉JMeter显示Unicode代码点列表
  • 我将查看我最后的日志文件。。。虽然我认为即使是服务器日志也可能错误地映射字符
  • 另外,可能在我发布的文本字段内部进行变量扩展时,我引用了${TERM},可能在这一点上,它也映射到问号,但损坏发生在稍后的点上。如果发生这种情况,并且它在UI中被错误地显示,那么它可能会导致错误的结论
  • 我真正想做的是在第一条CSV记录之后暂停JMeter,就在该行被加载之后,然后用“数据范围”或字节编辑器之类的工具查看它。不确定这是否可行

    • 发现了问题,必须指定UTF-8的另一个位置

      在方法右侧的HTTP请求中,还必须将内容编码设置为UTF-8

      是的,事后看来,这似乎是显而易见的,但我有很多理由认为不需要这样做。我的一些错误假设可能对正在调试的其他人有所帮助,因此,我认为:

      1:一旦文本以Unicode的形式进入Java,它将保持Unicode的状态,并通过UTF-8进出。显然不是在这种情况下

      2:我有点认为HTTP默认为UTF-8,除非你另有说明,但也许我只是习惯于XML,但这可能不是一个好的实践,可能HTTP默认为ISO-Latin1或其他什么,或者即使有规范,人们也可能不遵循它

      3:如果我没有具体说明,我认为“无害”的方法是将字符传递给对方,让另一端的接收者来处理。又错了

      (好的,所以点1、2和3有点重叠)

      4:即使我的HTTP请求帖子,我还是尝试了Encode复选框。我当然认为这会对它进行编码,但我得到的只是问号的重复%hex,所以在我看来,数据在那一点上已经损坏了。又错了。我怀疑在HTTP阶段,有两个字符转换,第一个是从Unicode到它认为你有的任何编码,第二个是%符号编码,我的数据在第一步就被错误编码了

      他说:我本以为JMeter会说些什么或发出警告,但从我的阅读来看,显然在这方面没有帮助。你可以做日志记录之类的

      默认情况下,“?”是Java报告问题的方式,它从Java 1.4x时间段开始。在我的Java代码中,我更喜欢将编码错误设置为异常报告,但同样,不是默认值,也不是JMeter所做的

      所以我吸取了教训

      Unicode至少一开始是OK的暗示是问号的数量等于日语字符的数量,而不是问号数量的2到3倍。如果“?”的长度与您的日语(或中文)字符串相匹配,那么Java确实在旅途中的某个时刻看到了实际的Unicode字符。然而,如果您看到的?'s是输入文本的3倍,那么Java总是将它们视为字节、整数或其他任何形式,而不是有效的代码