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

Mar*_*ett 2 csv encoding jmeter utf-8

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

\n\n

我所看到的:

\n\n
    \n
  • 输入文本:\n 雪豹 \xe3\x82\x92\xe3\x82\xa4\xe3\x83\xb3\xe3\x82\xb9\xe3\x83\x88\xe3\x83\xbc\xe3\x83\xab\ xe3\x81\x99\xe3\x82\x8b\xe5\xa0\xb4\xe5\x90\x88\xe3\x80\x81\xe6\x96\xb0\xe3\x81\x97\xe3\x81\x84
  • \n
  • 变成:\n 雪豹 ???????????????
  • \n
\n\n

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

\n\n

关于数据:

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

有趣的注释:\n我注意到一个有趣的巧合:如果有 15 个日语字符,那么我会得到 15 个问号,因此在某些时候它会被视为完整字符而不仅仅是字节。

\n\n

JMeter CSV 数据集配置:

\n\n
    \n
  • 文件名: japanese-searches.csv
  • \n
  • 文件编码:UTF-8(也尝试过不使用)
  • \n
  • 变量名称:术语
  • \n
  • 分隔符:,
  • \n
  • 允许引用的数据:False(我也尝试过True,不同,但仍然错误)
  • \n
  • EOF 处回收:True
  • \n
  • 在 EOF 处停止:False
  • \n
  • 凝视模式:所有线程
  • \n
\n\n

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

\n\n

我不确定读入 CSV 的每一行后如何“调试”。我认为它立即损坏了,但我不确定。

\n\n

如果它只是在我引用它时被破坏,那么可能不是 ${TERM} 而是其他一些“字节”函数调用。我将开始检查这一点。我还没有对 JMeter 函数做任何事情。

\n\n

12 月 24 日编辑:

\n\n

调整:

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

一个新理论:

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

Mar*_*ett 5

发现问题了,还有一个地方需要指定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 请求 POST,我仍然尝试了编码复选框。我当然认为这会对它进行编码,但我得到的只是问号的重复%十六进制,所以在我看来数据在那时已经损坏了。又错了。我怀疑在 HTTP 阶段内,有两个字符转换,首先从 Unicode 到它认为您拥有的任何编码,然后第二次编码到 %signs,而我的数据在第一步被错误编码。

5:我本以为 JMeter 会说些什么或警告,但从我的阅读来看,显然它在这方面没有帮助。您可以进行日志记录或其他操作。

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

所以我吸取了教训。

Unicode 至少开始时表现良好的暗示是问号的数量等于日语字符的数量,而不是问号数量的 2 或 3 倍。如果“???”的长度 匹配您的日语(或中文)字符串,那么 Java 在整个过程中的某个时刻确实看到了实际的 Unicode 字符。然而,如果您看到 ? 的数量是输入文本的 3 倍,那么 Java 总是将它们视为字节或整数或其他任何内容,而永远不会将其视为有效的代码点。