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

时间:2010-12-22 22:48:29

标签: encoding csv utf-8 jmeter

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

我所看到的:

  • 输入文字:    Snow Leopardをインストールする场合,新しい
  • 变成:    雪豹??????????????

这是我在HTTP的POST字段中。 如果我将JMeter设置为对数据进行编码,则只需输入问号的百分比序列。

关于数据:

  • CSV文件非常简单 结构
  • 只有一个字段/一列, 我将其命名为TERM,后来用作 $ {TERM}
  • 我真的不需要完整的CSV,因为每行只有一个字符串。
  • 没有逗号或引号。
  • 这是UTF-8,当我在文件上运行Unix“file”命令时,它会显示UTF-8文本。
  • 我还在两台机器上以命令行和图形模式验证了UTF-8。

有趣的说明: 我注意到一个有趣的巧合:如果有15个日文字符,那么我会得到15个问号,所以在某些时候它被视为完整字符而不仅仅是字节。

JMeter CSV数据集配置:

  • 文件名:japanese-searching.csv
  • 文件编码:UTF-8(也试过没有)
  • 变量名称:TERM
  • 分隔符:,
  • 允许引用数据:错误(我也尝试过,不同,但仍然错误)
  • EOF回收:真实
  • 停在EOF:False
  • 凝视模式:所有线程

我尝试过的一些事情:   - 尝试允许引用的数据。它变成了其他奇怪的角色。   - 添加-Dfile.encoding = UTF-8   - 尝试编码POST阶段,但它只是变成了一堆%nn的问号

我不确定在读取每一行CSV之后是如何“调试”的。我认为它已经被破坏了,但我不确定。

如果它仅在我引用它时被破坏,那么代替$ {TERM}可能还有一些其他“to bytes”函数调用。我会开始检查那个。我还没有对JMeter函数做过任何事情。

12月24日编辑:

调整菜谱方案:

  • 更改了格式并添加了项目符号 要点更清晰。
  • 澄清该文件是UTF-8,并验证了该文件。

一个新理论:

  • 日文字符是否可能正在通过,问题是每个显示它们的单个地方都将它们映射到“?”仅在显示时间。所以即使我已经检查了很多地方,它们在UI中都有显示问题吗?
  • JMeter中是否有办法查看字符或字符串的数值?实际上,告诉JMeter显示Unicode代码点列表?
  • 我会查看我的上一个日志文件...虽然我认为即使是服务器日志也可能错误地映射了这些字符。
  • 另外,也许在我POST的文本字段中进行变量扩展时,我引用了$ {TERM},也许在那个点它也会映射到问号,但是腐败发生在后来的那一点。如果发生这种情况,并且在UI中显示错误,则可能导致错误的结论。
  • 我真正想做的是在第一张CSV记录之后暂停JMeter,就在加载该行之后,用“数据范围”或字节编辑器等查看它。不确定这是否可行。

3 个答案:

答案 0 :(得分:3)

在搜索使用csv文件中的参数的解决方案时遇到了这个主题,该文件包含一些用希伯来语编写的列。

  1. 我使用Excel 2007为用户注册创建了1000行数据。第一个和最后一个名字必须是希伯来语。 我将文件导出到“Unicode文本”文件。它成为制表符分隔。 “Unicode Text”以UTF-16 LE(Little Endian)保存,而不是UTF-8。这很重要。

  2. 我在Notepad ++中打开了结果。我能正确地看到希伯来字母。 Notepad ++具有“编码”菜单项,您可以在其中检查编码或更改编码。所以我将Little Endian改为UTF-8。 然后我用逗号替换了标签(只需选中标签并将其粘贴到查找框中。

  3. 参数替换正常,但在运行脚本后,我看到以下内容: 在“查看结果树”监听器中,我打开了“Http请求”的“结果”选项卡。 参数被替换,但请求的HTTP视图选项卡(在底部)显示了一些胡言乱语。 但是当我查看Raw视图时,我看到请求参数实际上包含了%D7%A9%D7%A8%D7%9E%D7%95%D7%98%D7%94这些字符串成对时(%) D7%A9)核心应对希伯来字母。

  4. 在我看来,JMeter有一个错误,无法正确显示unicode字符。但它发送(POST)它们确定。

    希望我是对的,并希望它会帮助某人。

答案 1 :(得分:2)

发现问题,还有另一个地方必须指定UTF-8。

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

是的,事后看来,这似乎是显而易见的,但有很多原因我认为不需要这样做。我的一些不正确的假设可能对正在调试的其他人有所帮助,所以这里 - 我会想到:

1:一旦文本将其作为Unicode转换为Java,它将保持为Unicode,并通过UTF-8进入和退出。显然不是在这种情况下。

2:我认为HTTP默认为UTF-8,除非你另有说法,但也许我只是习惯于XML,但可能不是一个很好的做法来假设,也许HTTP默认为ISO-Latin1或者其他什么东西,或者即使有规格,也许人们不遵循它。

3:如果我没有具体说明,我认为“不伤害”的方法是传递角色,让接收者在另一端处理它。错了!

(好的,所以第1,2和3点重叠一点)

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

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

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

所以我吸取了教训。

Unicode至少开始OK的提示是问号的数量等于日文字符的数量,而不是问号的2或3倍。如果长度为“???”匹配您的日语(或中文)字符串,然后Java DID在旅途中的某个点查看实际的Unicode字符。然而,如果您看到输入文本的数量是输入文本的3倍,那么Java总是将它们视为字节或整数或其他任何内容,而且从不作为有效的代码点。

答案 2 :(得分:1)

您可以尝试在内容编码中使用“SHIFT-JIS”(它在附近的方法选择中)。那你应该取消选中“编码?”对于包含日语的参数。

希望它对你有用。