成功解决:Invalid encoding name “UTF8“

文章讲述了在MyBatis配置文件Mapper.xml中遇到的编码问题,提示错误因UTF8编码不被解析。解决办法是将encoding属性从UTF8改为UTF-8,确保代码成功运行。

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

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。

前言

出现这个问题可能由于不同的原因、本文是由于**Mapper.xml文件中设置的编码格式问题,需要将encoding="UTF8" 改成encoding="UTF-8"

1、报错信息

Caused by: org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 38; Invalid encoding name "UTF8".
	at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:263) ~[mybatis-3.5.6.jar:3.5.6]
	at org.apache.ibatis.parsing.XPathParser.<init>(XPathParser.java:127) ~[mybatis-3.5.6.jar:3.5.6]
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.<init>(XMLMapperBuilder.java:81) ~[mybatis-3.5.6.jar:3.5.6]
	at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:610) ~[mybatis-spring-2.0.6.jar:2.0.6]
	... 79 common frames omitted
Caused by: org.xml.sax.SAXParseException: Invalid encoding name "UTF8".
	at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.impl.XMLEntityManager.createReader(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.impl.XMLEntityManager$ScannedEntity.setReader(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.impl.XMLEntityScanner.setEncoding(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanXMLDeclOrTextDecl(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.impl.XMLDocumentScannerImpl$XMLDeclDispatcher.dispatch(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.parsers.DOMParser.parse(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source) ~[xercesImpl-2.11.0.jar:na]
	at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:261) ~[mybatis-3.5.6.jar:3.5.6]
	... 82 common frames omitted

2、解决方法

需要将encoding="UTF8" 改成encoding="UTF-8"

在这里插入图片描述

3、成功解决

在此运行程序可以成功启动

在这里插入图片描述

<think>嗯,用户遇到了调用MyContract.processProof时的参数编码错误,提示“invalid arrayify value”。首先,我需要分析可能的原因。根据引用[2],函数的参数编码和函数选择子相关,可能用户提供的参数类型或格式不符合ABI规范。 可能的问题点有几个:参数类型不匹配,比如应该传bytes类型却传了字符串;数组或结构体格式不正确,比如没有正确包裹在数组里;特殊数据类型如地址没有校验格式;或者存在编码版本的问题,比如Solidity版本不同导致ABI差异。 接下来,我需要逐步排查。检查ABI定义,确认processProof的参数类型,比如是否需要bytes、uint等。然后验证输入格式,比如十六进制字符串是否以0x开头,数组是否用正确括号包裹。使用ethers.js的ABICoder来手动编码参数,看哪里出错。另外,检查是否有不可见的特殊字符,或者字符串转bytes时的填充问题。 解决方法包括确保参数类型正确,使用正确的编码工具,处理特殊格式如地址和bytes,以及分步调试。可能还需要查看合约源码和ABI,确认参数结构。例如,如果proof是bytes类型,需要确保传入的是正确的十六进制格式,而不是普通字符串。</think>### 调用MyContract.processProof参数编码错误分析 #### 错误原因分析 1. **参数类型不匹配** 合约方法`processProof`的参数类型(如`bytes`、`uint256`、`address`等)与传入的JavaScript数据类型不一致。例如: - 若参数定义为`bytes`类型,传入的字符串需转换为十六进制格式(如`0x1234`),否则会触发`invalid arrayify value`[^2] - 数组参数未正确包裹在`[]`中 2. **特殊数据格式要求** 根据引用[3],零知识证明相关参数(如Pedersen承诺、ElGamal加密数据)通常需要严格的字节序列格式。例如: ```javascript // 错误示例:普通字符串无法直接转为bytes const invalidProof = "a1b2c3"; // 正确示例:带0x前缀的十六进制字符串 const validProof = "0xa1b2c3..."; ``` 3. **ABI编码版本问题** 如果合约使用旧版Solidity编译(如0.4.x),可能与Web3.js/ethers.js的默认ABI编码规则不兼容[^1] #### 分步解决方案 1. **检查ABI定义** 通过引用[1]中的方法打印合约ABI,确认`processProof`的参数结构: ```javascript const abi = JSON.parse(cacl.contracts[':MyContract'].interface); console.log(abi.find(m => m.name === 'processProof')); ``` 2. **标准化参数格式** ```javascript // 示例:处理bytes类型参数 const proofData = ethers.utils.hexlify(ethers.utils.toUtf8Bytes("proof_data")); // 示例:处理数值类型参数 const valueParam = ethers.BigNumber.from("1000000000000000000"); // 1e18 ``` 3. **手动编码验证** 使用`ethers.utils.AbiCoder`验证编码过程: ```javascript const coder = new ethers.utils.AbiCoder(); try { const encoded = coder.encode( ["bytes", "uint256"], // 参数类型列表 [proofData, valueParam] ); console.log("Encoded:", encoded); } catch (error) { console.error("Encoding failed:", error); } ``` 4. **特殊数据处理** 对于零知识证明参数(如引用[3]提到的ZK Token proof): ```javascript // 从密码学库获取标准化的证明字节 const zkProof = getZKProofFromLibrary(); // 返回Buffer类型 const formattedProof = ethers.utils.hexlify(zkProof); ``` #### 完整调用示例 ```javascript const contract = new ethers.Contract( contractAddress, abi, signer ); const tx = await contract.processProof( "0x1234...", // bytes proof ethers.BigNumber.from(100), // uint256 input "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B" // address ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乡下小哥编程

整理不易、多谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值