This commit is contained in:
Looly 2024-01-24 16:49:05 +08:00
parent 4753a2dc0e
commit 79ef7de544

View File

@ -65,29 +65,7 @@ public class QrConfig {
* 纠错级别
*/
protected ErrorCorrectionLevel errorCorrection = ErrorCorrectionLevel.M;
/**
* 是否开启ECI编码<br>
* 如果enableEci=false,则二维码中不包含ECI信息{@link #charset}字符编码设置无效, 二维码为英文字符保持false最佳<br>
* 如果enableEci=true,则二维码中包含ECI信息按照{@link #charset}编码进行设置, 二维码为包含中文保持true最佳否则会中文乱码<br>
*
* 参考1<a href="https://github.com/nutzam/nutz-qrcode/issues/6">关于\000026的问题</a>
* 参考2<a href="https://en.wikipedia.org/wiki/Extended_Channel_Interpretation">ECIExtended_Channel_Interpretation模式</a> <br><br>
* 参考3<a href="https://www.51cto.com/article/414082.html">二维码的生成细节和原理</a> <br><br>
* <p>二维码编码有ECI模式和非ECI模式的情况之分在ECI模式下第一个字节是用作编码标识而非ECI模式下直接就是数据流
* ECI模式其实是更好的方案这样子解码的时候可以根据标识采用不同的编码方式而非ECI模式只能按照一种统一的方式处理了
* 但是由于部分设备不支持ECI模式所以就出现了无法识别的情况
* 使用扫码桩/扫码枪可能会出现\000026的字符使用手机扫描其他二维码解析软件扫描则不会出现
* </p>
*
* <p>
* ECI编码表可以看出UTF-8就是对应"\000026"对应数字22<br><br>
* </p>
*
* <p> 总结建议如果二维码内容全是字符没有中文就不用使用UTF-8等格式进行编码只有使用中文等特殊符号才需要编码 </p>
*
* @see EncodeHintType#PDF417_AUTO_ECI
*/
protected Boolean enableEci = false;
/**
* 编码
*/
@ -290,22 +268,39 @@ public class QrConfig {
}
/**
* 获取是否开启了ECI编码
* 是否开启ECI编码<br>
* 如果enableEci=false,则二维码中不包含ECI信息{@link #charset}字符编码设置为{@code null}, 二维码为英文字符保持false最佳<br>
* 如果enableEci=true,则二维码中包含ECI信息按照{@link #charset}编码进行设置, 二维码为包含中文保持true最佳否则会中文乱码<br>
*
* @return 是否开启ECI编码true: 开启false: 未开启默认未开启
*/
public Boolean getEnableEci() {
return enableEci;
}
/**
* 设置二维码是否开启ECI编码部分老设备不兼容该模式建议不开启
* <ul>
* <li>参考1<a href="https://github.com/nutzam/nutz-qrcode/issues/6">关于\000026的问题</a></li>
* <li>参考2<a href="https://en.wikipedia.org/wiki/Extended_Channel_Interpretation">ECIExtended_Channel_Interpretation模式</a></li>
* <li>参考3<a href="https://www.51cto.com/article/414082.html">二维码的生成细节和原理</a></li>
* </ul>
*
* @param enableEci 二维码是否开启ECI编码
* <p>
* 二维码编码有ECI模式和非ECI模式的情况之分在ECI模式下第一个字节是用作编码标识而非ECI模式下直接就是数据流
* ECI模式其实是更好的方案这样子解码的时候可以根据标识采用不同的编码方式而非ECI模式只能按照一种统一的方式处理了
* 但是由于部分设备不支持ECI模式所以就出现了无法识别的情况
* 使用扫码桩/扫码枪可能会出现\000026的字符使用手机扫描其他二维码解析软件扫描则不会出现
* </p>
*
* <p>
* ECI编码表可以看出UTF-8就是对应"\000026"对应数字22<br><br>
* </p>
*
* <p> 总结建议如果二维码内容全是字符没有中文就不用使用UTF-8等格式进行编码只有使用中文等特殊符号才需要编码 </p>
*
* @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<EncodeHintType, Object> 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;