diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/qrcode/QrConfig.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/qrcode/QrConfig.java index 078693a65..d83b31878 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/qrcode/QrConfig.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/qrcode/QrConfig.java @@ -65,29 +65,7 @@ public class QrConfig { * 纠错级别 */ protected ErrorCorrectionLevel errorCorrection = ErrorCorrectionLevel.M; - /** - * 是否开启ECI编码
- * 如果enableEci=false,则二维码中不包含ECI信息,即:{@link #charset}字符编码设置无效, 二维码为英文字符,保持false最佳
- * 如果enableEci=true,则二维码中包含ECI信息,即:按照{@link #charset}编码进行设置, 二维码为包含中文,保持true最佳,否则会中文乱码
- * - * 参考1:关于\000026的问题 - * 参考2:ECI(Extended_Channel_Interpretation)模式

- * 参考3:二维码的生成细节和原理

- *

二维码编码有ECI模式和非ECI模式的情况之分,在ECI模式下第一个字节是用作编码标识,而非ECI模式下直接就是数据流。 - * ECI模式其实是更好的方案,这样子解码的时候可以根据标识采用不同的编码方式。而非ECI模式只能按照一种统一的方式处理了。 - * 但是由于部分设备不支持ECI模式,所以就出现了无法识别的情况。 - * 使用扫码桩/扫码枪,可能会出现\000026的字符。使用手机扫描、其他二维码解析软件扫描,则不会出现。 - *

- * - *

- * ECI编码表可以看出UTF-8就是对应"\000026"(对应数字22)

- *

- * - *

总结建议:如果二维码内容全是字符,没有中文,就不用使用UTF-8等格式进行编码,只有使用中文等特殊符号才需要编码

- * - * @see EncodeHintType#PDF417_AUTO_ECI - */ - protected Boolean enableEci = false; + /** * 编码 */ @@ -290,22 +268,39 @@ public class QrConfig { } /** - * 获取是否开启了ECI编码 + * 是否开启ECI编码
+ * 如果enableEci=false,则二维码中不包含ECI信息,即:{@link #charset}字符编码设置为{@code null}, 二维码为英文字符,保持false最佳
+ * 如果enableEci=true,则二维码中包含ECI信息,即:按照{@link #charset}编码进行设置, 二维码为包含中文,保持true最佳,否则会中文乱码
* - * @return 是否开启ECI编码,true: 开启,false: 未开启;默认:未开启 - */ - public Boolean getEnableEci() { - return enableEci; - } - - /** - * 设置二维码是否开启ECI编码,部分老设备不兼容该模式,建议不开启 + * * - * @param enableEci 二维码是否开启ECI编码 + *

+ * 二维码编码有ECI模式和非ECI模式的情况之分,在ECI模式下第一个字节是用作编码标识,而非ECI模式下直接就是数据流。 + * ECI模式其实是更好的方案,这样子解码的时候可以根据标识采用不同的编码方式。而非ECI模式只能按照一种统一的方式处理了。 + * 但是由于部分设备不支持ECI模式,所以就出现了无法识别的情况。 + * 使用扫码桩/扫码枪,可能会出现\000026的字符。使用手机扫描、其他二维码解析软件扫描,则不会出现。 + *

+ * + *

+ * ECI编码表可以看出UTF-8就是对应"\000026"(对应数字22)

+ *

+ * + *

总结建议:如果二维码内容全是字符,没有中文,就不用使用UTF-8等格式进行编码,只有使用中文等特殊符号才需要编码

+ * + * @param enableEci 是否开启ECI + * @see EncodeHintType#PDF417_AUTO_ECI */ - public void setEnableEci(Boolean enableEci) { - if (enableEci == null) { - this.enableEci = enableEci; + public void setEnableEci(final boolean enableEci) { + if (enableEci) { + if(null == this.charset){ + this.charset = CharsetUtil.UTF_8; + } + } else { + this.charset = null; } } @@ -452,10 +447,8 @@ public class QrConfig { final HashMap hints = new HashMap<>(); // 只有不禁用(即开启)ECI编码功能,才使用自定义的字符编码 // 二维码内容就是英文字符,建议不设置编码,没有任何问题;对于中文来说,会乱码 - if (this.enableEci) { - if (null != this.charset) { - hints.put(EncodeHintType.CHARACTER_SET, charset.toString().toLowerCase()); - } + if (null != this.charset) { + hints.put(EncodeHintType.CHARACTER_SET, charset.toString().toLowerCase()); } if (null != this.errorCorrection) { final Object value;