QRCode使用Encoding.UTF8编码时,报错

本文详细解析了在使用QRCode编码时遇到的字符集长度限制问题,尤其是在使用Encoding.UTF8编码时出现的错误。文章提供了具体的解决方案,包括调整QrcodeVersion值和图片尺寸,以确保二维码的正确生成与解码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QRCode使用Encoding.UTF8编码时,报错:

 

c#中索引超出数组界限

 

 

 

百度查了下,有位仁兄的帖子跟我的问题一样,按照帖子的办法解决了。。。yes!

 

 

http://bbs.youkuaiyun.com/topics/391847311

 

已解决,将qrCodeEncoder.QRCodeVersion ;改为0即可

 

 

 

查了下原因,下面的解释就很好:

 

http://blog.youkuaiyun.com/wadyloo/article/details/8787502

 

QRCODE的QrcodeVersion问题

 

 

为什么要在生成二维码的时候,判断字符集的长度要小于128。要知道二维码信息容量大:可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍。如果控制压缩内容在128个以内的话,那么二维码的优势哪里去了?

 
经过多次测试发现,二维码所能包含的字符信息量是由QrcodeVersion的设置值来决定的。将QrcodeVersion设置到20的时候,就已经可以容乃到300多个字节。
 
如果你以为这样就解决了问题的话,那么就错了,嘿嘿。如果只是修改了QrcodeVersion的值,解决的仅仅是字符集容量的问题,可是这样生成的图片无法解码。可是把字符容量控制在128个以内的时候,就可以正常的解码。难道日本人写的东西会有这么多的问题,网上搜来搜去,只能找到几个难兄难弟,但是没有找到解决的方法。
 
无意中打开生成的图片一看才发现了问题,生成的二维码图片的大小是会根据所压缩的信息内容而变化的,网上提供的例子是通过new BufferedImage(139, 139, BufferedImage.TYPE_INT_RGB);来创建图像对象的,默认的情况下图片的大小是139*139,这个大小是比较适合QrcodeVersion为7的情况。将图片的大小设置到300*300就可以很好的支持QrcodeVersion为20的情况,并且可以正常的解码。
 
QrcodeVersion的范围值是0-40,0的含义是表示压缩的信息量将会根据实际传入值确定,只有最高上限的控制,而且图片的大小将会根据信息量自动缩放。1-40的范围值,则有固定的信息量上限,而且图片的大小会固定在一个大小上,不会根据信息量的多少而变化。
 
以上就是在应用QRCode这个工具时遇到的一些问题,留档备案。
 
以上都是我copy的,高人在民间,瞬间解决问题。

转载于:https://my.oschina.net/lylyg/blog/3023024

<template> <view class="scan-container"> <!-- 相机视图 --> <camera v-if="cameraActive && hasPermission" class="camera" device-position="back" flash="off" @error="cameraError"></camera> <!-- 操作按钮区域 --> <view class="album-button" @click="handleChooseImage"> <image src="@/static/icons/photofff.svg" mode="" class="album-img"></image> </view> <!-- 结果弹窗 --> <uni-popup ref="resultPopup" type="dialog"> <uni-popup-dialog title="扫码结果" :content="scanResult" confirmText="复制" @confirm="copyResult"></uni-popup-dialog> </uni-popup> </view> </template> <script setup> import { ref, onMounted, onUnmounted } from 'vue' import { onLoad } from '@dcloudio/uni-app' // 状态管理 const cameraActive = ref(false) const scanResult = ref('') const resultPopup = ref(null) onLoad((e) => { initScan() }) onUnmounted(() => { stopScan() }) // 初始化扫码 const initScan = async () => { cameraActive.value = true setTimeout(scanQRCode, 300) // 稍等相机初始化 } // 停止扫描 const stopScan = () => { cameraActive.value = false } // 扫码功能 const scanQRCode = () => { uni.scanCode({ onlyFromCamera: true, // 只允许相机扫码 scanType: ['qrCode'], success: (res) => { handleScanResult(res.result) }, fail: (err) => { console.error('扫码失败:', err) uni.showToast({ title: '扫码失败', icon: 'none' }) }, complete: () => { cameraActive.value = false } }) } // 从相册选择图片 const handleChooseImage = async () => { // 1. 从相册选择图片 uni.chooseImage({ count: 1, // 只选择1张图片 sizeType: ['compressed'], // 压缩图 sourceType: ['album'], // 从相册选择 success: (res) => { const tempFilePaths = res.tempFilePaths; // 2. 读取图片文件内容 uni.getFileSystemManager().readFile({ filePath: tempFilePaths[0], encoding: 'base64', // 转换为base64格式 success: (fileRes) => { // 3. 调用微信小程序识别二维码API wx.scanQRCode({ needResult: 1, // 返回识别结果 path: tempFilePaths[0], // 图片路径 scanType: ['qrCode'], // 只识别二维码 success: (scanRes) => { // 4. 处理识别结果 handleScanResult(scanRes.result); }, fail: (scanErr) => { console.error('二维码识别失败', scanErr); uni.showToast({ title: '未识别到二维码', icon: 'none' }); } }); }, fail: (fileErr) => { console.error('图片读取失败', fileErr); } }); }, fail: (chooseErr) => { console.error('图片选择失败', chooseErr); } }); } // 处理扫码结果 const handleScanResult = (result) => { scanResult.value = result cameraActive.value = false resultPopup.value.open() } // 显示结果弹窗 const showResultModal = () => { uni.showModal({ title: '扫码结果', content: scanResult.value, confirmText: '复制', success: (res) => { if (res.confirm) { uni.setClipboardData({ data: scanResult.value }) } } }) } // 相机错误处理 const cameraError = (e) => { console.error('相机错误:', e.detail) uni.showToast({ title: '相机初始化失败', icon: 'none' }) cameraActive.value = false } </script> <style scoped> .scan-container { display: flex; flex-direction: column; height: 100vh; position: relative; } .camera { flex: 1; width: 100%; } /* // 相册 */ .album-button { position: absolute; bottom: 300rpx; left: 100rpx; background: rgba(193, 200, 210, .4); border-radius: 50px; width: 100rpx; height: 100rpx; display: flex; align-items: center; justify-content: center; .album-img { width: 60rpx; height: 60rpx; } } .btn { width: 45%; background-color: #07C160; color: white; border-radius: 10rpx; } </style>这写代码报的错message:真机调试 Error: wxss 编译错误,错误信息:ErrorFileCount[1] ./Device/QrcodeScanner/QrcodeScanner.wxss(1:519): unexpected `{` at pos 519 [20250622 09:17:39][wxb835c5e4eaa21787] appid: wxb835c5e4eaa21787 openid: o6zAJswBDjIXrKdTl-xmJA0gwl4g ideVersion: 1.06.2412050 osType: win32-x64 time: 2025-06-22 09:20:10
最新发布
06-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值