JMeter 5.4.1中波兰字符的ISO-8859-2 URL编码方案求助
JMeter 5.4.1 中波兰字符的 ISO-8859-2 URL 编码解决方案
针对字符串 Urząd 转换为 Urz%B1d 的需求,以下是Groovy和BeanShell两种可行方案:
Groovy 实现
方案1:使用 Apache Commons Codec 的 URLCodec(推荐)
JMeter自带Commons Codec库,可直接调用URLCodec类指定字符集编码:
import org.apache.commons.codec.net.URLCodec def input = "Urząd" def codec = new URLCodec("ISO-8859-2") def encoded = codec.encode(input) // 将结果存入变量供后续使用 vars.put("encodedString", encoded)
方案2:手动处理字节编码
若不想依赖第三方类,可手动遍历字符字节并转换为URL编码格式:
def input = "Urząd" def charset = "ISO-8859-2" def encoded = new StringBuilder() input.eachByte(charset) { byte b -> int unsignedByte = b & 0xFF // 保留可打印ASCII字符(排除URL特殊字符),其余转为%XX格式 if ((unsignedByte >= 0x20 && unsignedByte <= 0x7E) && !['%', '&', '+', ',', '/', ':', ';', '=', '?', '@', '[', '\\', ']', '^', '`', '{', '|', '}', '~'].contains((char)unsignedByte)) { encoded.append((char)unsignedByte) } else { encoded.append(String.format("%%%02X", unsignedByte)) } } vars.put("encodedString", encoded.toString())
BeanShell 实现
方案1:使用 Apache Commons Codec 的 URLCodec
import org.apache.commons.codec.net.URLCodec; String input = "Urząd"; URLCodec codec = new URLCodec("ISO-8859-2"); String encoded = codec.encode(input); vars.put("encodedString", encoded);
方案2:手动字节处理
String input = "Urząd"; String charset = "ISO-8859-2"; StringBuilder encoded = new StringBuilder(); try { byte[] bytes = input.getBytes(charset); for (byte b : bytes) { int unsignedByte = b & 0xFF; if ((unsignedByte >= 0x20 && unsignedByte <= 0x7E) && !"%&+,/:;=?@[\\]^`{|}~".contains(String.valueOf((char)unsignedByte))) { encoded.append((char)unsignedByte); } else { encoded.append(String.format("%%%02X", unsignedByte)); } } vars.put("encodedString", encoded.toString()); } catch (UnsupportedEncodingException e) { log.error("编码失败:" + e.getMessage()); }
说明
JMeter 5.5 中直接使用 URLEncoder.encode('Urząd','ISO-8859-2') 可行,是因为其依赖的JDK版本或URLEncoder实现对字符集的处理更稳定。而5.4.1中该方法可能因默认字符集优先级问题,导致编码结果不符合预期,因此推荐使用上述依赖明确字符集的方案。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

