UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xae in position 163: illegal multibyte sequence

文章主要讲述了在使用Python的execjs库执行包含汉字的JavaScript代码时遇到的GBK编码错误问题。通过分析,问题出在js代码中的汉字编码不兼容。解决方案包括:调整Python的subprocess模块编码设置,避免在JS测试文件名中使用test,以及确保环境变量配置正确,特别是对于Node.js全局模块路径的配置。最后提供了完整的修复代码示例。

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

项目场景:

python的execjs执行接js报编码错误

UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xae in position 163: illegal multibyte sequence

问题描述

提示:这里描述项目中遇到的问题:

例如:python的execjs执行接js报编码错误

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:\ProgramData\Anaconda3\lib\subprocess.py", line 1370, in _readerthread
    buffer.append(fh.read())
UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 163: illegal multibyte sequence
Traceback (most recent call last):
  File "E:/BaiduSyncdisk/code/qiyezizhi_shigongzheng/qiyezizhi/demo.py", line 89, in <module>
    decrypted_data = execjs.compile(jzsc_mohurd_js).call('getData', str(a))#.encode('gb18030','ignore')
  File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_abstract_runtime_context.py", line 37, in call
    return self._call(name, *args)
  File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_external_runtime.py", line 92, in _call
    return self._eval("{identifier}.apply(this, {args})".format(identifier=identifier, args=args))
  File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_external_runtime.py", line 78, in _eval
    return self.exec_(code)
  File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_abstract_runtime_context.py", line 18, in exec_
    return self._exec_(source)
  File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_external_runtime.py", line 87, in _exec_
    output = self._exec_with_pipe(source)
  File "C:\ProgramData\Anaconda3\lib\site-packages\execjs\_external_runtime.py", line 103, in _exec_with_pipe
    stdoutdata, stderrdata = p.communicate(input=input)
  File "C:\ProgramData\Anaconda3\lib\subprocess.py", line 1028, in communicate
    stdout, stderr = self._communicate(input, endtime, timeout)
  File "C:\ProgramData\Anaconda3\lib\subprocess.py", line 1420, in _communicate
    stdout = stdout[0]
IndexError: list index out of range
UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xae in position 163: illegal multibyte sequence

执行以下代码

var CryptoJS = require('crypto-js')

function getData(t) {
    var m = CryptoJS.enc.Utf8.parse("0123456789ABCDEF"),
        f = CryptoJS.enc.Utf8.parse("jo8j9wGw%6HbxfFn"),
        e = CryptoJS.enc.Hex.parse(t),
        n = CryptoJS.enc.Base64.stringify(e),
        a = CryptoJS.AES.decrypt(n, f, {
            iv: m,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
    }),
        r = a.toString(CryptoJS.enc.Utf8);
    return r.toString()
}

原因分析:

js中有汉字无法编码

解决方案:

三个点

1 js中有汉字无法编码导致异常

subprocess.py文件的原因
subprocess一定要放在 导入import execjs之前

import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')
# 一定要放在 导入import execjs之前
import execjs

2 写javascript的测试代码文件命名不要有test,更不要完全为test会导致pycharm到单元测试页面,没法正常显示,文件名称改为demo之类

3 环境变量没配置好,需要加 execjs.compile(js中的函数,cwd=r"D:/software2/node/node_global/node_modules"),或者把node.js的全局变量配置好

环境配置

在这里插入图片描述

在这里插入图片描述

完整代码

import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')
# 一定要放在 导入import execjs之前
import execjs
with open('test.js', 'r', encoding='utf-8') as f:
    jzsc_mohurd_js = f.read()
a='95780ba0943730051dccb5fe3918f9fea6117a6e2137e8c0c167df14ee9731cf332d8d6aec002dbcf3abc19ca03aa0e502095345d9c7bbdbac5158e14a909fbe26b351f95e6c5274d04aab9610cf457f6d2ec5d16458266928175054c9a9e935e2a9b625249f0aefaf1f9f086342b8e0c0f162195b30570b2cac0821feae2ec6f0da770a7365a4ecaeaf8764109f5436aa9d0fd3fd5495fe7d7f4b0462b8cb9397121e32869c414ca240c88cbad11fe5a827b5d69a26db420dfeaedbff7116580518d70837dbd57568718361e5b59e63a04b21942e67428bf2693a6b6d6b39804a1677922b4d98ae5a1f15a03920489eca9cbcac8338af0d51b55770445d0e9a571b9726282681cb0256fb9d7257a299645b207e4c35fec89677ff0e052bbe41de87a6576e4906e7f9406858c0a022a3522f82710a6ec8cfe46fe03dde81c2a33f7b7070ba4bc83cf67b00a4fd950fa8c2a4aed78da3d3e3741f01cace58227f45128af9d3ee4644b71d6729a16cabca8d57afa7059ff79094c3ba2e425a6881bdc5621526cb7c8ce14fd06e67aa4b11f591d39fcd56e7912b4994889e18cb0c532583d396d4b9f3190645c7069b45d56b1dc88dd4b7a0ae75a4e68246e2754a04abf01e9e38fda69c24075fad975a2c8265e59b94193b1430be425c53e34ecd81137b5b3302c5333ee7fea1526a4c58ea44e266af129434201afa071c4a2002574b9e4b0b679db59cea8da8dce4370c0e6747e95c47fef6ecb9bbe14b46c5996409ce309df3ac3528a6328c9cbb7030172d4a0319db182c84a86dc7bffe861bc287b0e53696b015724239d8c8de03718993bf1b968e15296444151abf8a305e2505f62a594d618397a9c56ee84de247b635dfa20ecd45884f609834bc7cb482530e229a88badb0abc524aac8f24481daa0f4a57bcb84ed42814952155a7599ee36443b4fce48e72983415700f30f9d6179c14397522daf80ca975717e8d87b6a8ffcadf27c73fb01137c0c3252b75fde995a7fa9efd86dbf7cf1982daeb3ddd1b562b8eea4fae97b40962c9890f09187c8457559ff3f70178a3531bd71e02d3d2cf868e401d61cf4245795dd2dbb8b49530e89325aef0045553d686c571ee9067f54e03956f8491174afce86e4723a190fa089318e75fa40dd503d8699f1843c6d0982de64cc2e9484eb78afb4dffb1f6fdfd14b06f4f3e3b7e1f1930cab25f66a21a744aa98e57198215aaced270d37cdc15d6c52e7d4b8244c05f01f9d8717305c9625f0cadc33f7b1225de747d5a5617cb816f19cd06aa3ad8298c4ebe35c50e340d7a56903a115d24193e23db2e717b75ec60b4f04594a1523973d811009ffbeb993c0bcdf4ca5077e6a7f3702020189ca868991b2b65c5e0a6cd019fe65d86e4b2b6d0b7cb824ceeac0d3cd98fb2ad368e5dbc26d6a4a52d79d9c2a34c700d544488321902389049b0dae2320f4a8fa2db09ecd1b04c9bd6ef6db4fcc70a9bf80fefaea1cc78ac61ab69b4d8b6ecefe38c2da3fc1fadde90871bd019a534e9def9778d7ec6e8c6507d2d98e0f675f46038a9d9015b5eb72d737723277303e820542314434cbf2dfb6a15c4c8ff2fe4e417c7068fdeb9e30efdda9f1412709de5a9fd16cb5d1f9d3541dbf43f0f4c19f7f8f035423ca0dd920bd8257f3cfde8394c69b537494d8d9fa930d78f245df94875d67413fb7ad7bfe00662b75eacbc10d5a6c21a3cd6d7f7c0e5c2076edfc247c36bd7519da5ab5910f204a4547f6d6ba574f6395407dae7b678b5be11c84055465df75cd42332270a0b822e2c8608b83f31483cb6c04f19b11062fd62842da018fe4ea963d78b2c84b15e412a464f7aeb856f2b9743a4b5a0c7d2bbb9a6166853b54a5a2258346bee4a78331311b42fd8116dcfab682bbc5d3347950693d80a411364239be0cf8b6d850eb91ae6034375861df5b69447ab75f05843b3e7e634a6e32830a05ec0efa544c486d41bd4f073624ddeff7481456061d6b8c40bd4b408f16b1d72d0649bcf18cf4482f807e5929142609719a83fe74ab8c90d23758536beb2c9234c2170b7bdfc286b403a07d83da88b5b4e884d3b15fbcb51'
decrypted_data = execjs.compile(jzsc_mohurd_js).call('getData', str(a))#.encode('gb18030','ignore')

# ,cwd=r"D:/software2/node/node_global/node_modules"
print(decrypted_data)#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值