首页 > 其他分享 >execjs - 编码报错问题解决方案

execjs - 编码报错问题解决方案

时间:2023-05-15 13:46:53浏览次数:39  
标签:编码 self JS 报错 Unicode input js execjs

当在Python中运行execjs时遇到编码问题,可能是由于JS代码中使用了非UTF-8编码。为了解决这个问题,您可以尝试以下两种方案


最直接方法需要修改Subprocess中的Enconding 为 "Utf-8"

  1. 将JS代码转换为UTF-8编码

您可以在JS代码中将所有字符串转换为UTF-8编码。例如,您可以在JS代码文件的开头添加以下语句:

// -*- coding: utf-8 -*-

然后在所有字符串前添加一个“u”前缀以指明它们是Unicode字符串:

var str = u'你好,世界!';

这样,在Python中调用execjs时就不会再遇到编码问题。

  1. 使用自定义的编解码器

您可以通过编写自定义的编解码器来将JS代码转换为Python中的Unicode格式。例如,以下代码定义了一段JS编解码器:

import json
from codecs import (Codec, StreamReader, StreamWriter)

class JSCodec(Codec):
    def encode(self, input, errors='strict'):
        # Convert a Python Unicode string to JavaScript source code as Unicode
        return json.dumps(input)[1:-1], len(input)

    def decode(self, input, errors='strict'):
        # Convert a JavaScript Unicode string literal to a Python Unicode string
        return json.loads('"' + input + '"'), len(input)

class JSStreamReader(StreamReader):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.reader = self.stream

    def read(self, size=-1, chars=-1):
        result = self.reader.read(size)
        return JSCodec().decode(result)[0]

class JSStreamWriter(StreamWriter):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.writer = self.stream

    def write(self, input):
        return self.writer.write(JSCodec().encode(input)[0])

然后,您可以使用此编解码器来打开JS代码文件和运行JS代码:

import codecs
import execjs

js_file = codecs.open('test.js', mode='r', encoding='JSCodec')
js_code = js_file.read()
js_ctx = execjs.compile(js_code)
result = js_ctx.call('test')

在这个示例中,我们使用JSCodec编解码器打开了一个JS文件,将其内容读取为Python Unicode字符串,然后使用execjs模块运行JS代码并获取结果。这样,在Python中调用execjs时就不会再遇到编码问题。

标签:编码,self,JS,报错,Unicode,input,js,execjs
From: https://www.cnblogs.com/irponies-python/p/17401605.html

相关文章

  • 接口自动化时64编码踩了个小坑
    1、在做api接口自动化时,请求的头部需要鉴权处理,账号信息要先进行64编码,首先要从配置文件中获取到账号和密码 2、获取到账号密码,进行64编码后设置请求头, 3、设置请求头时,"Authorization":"Basic{}".format(base.decode())这里一定要decode解码,否则会设备为鉴权失败,此为过......
  • 3D打印机报错!! {"code":"key243","msg":"Move out of range: 20.852 29.68
    修改配置文件stepper_z的配置终点需要改下,看你热床允许的倾斜度,相对于归零点,负的,最大的值 ......
  • 训练yolov5模型时报错AttributeError: Can't get attribute 'SPPF' on module 'models
    解决方法打开common.py文件,增加以下代码importwarningsclassSPPF(nn.Module):#SpatialPyramidPooling-Fast(SPPF)layerforYOLOv5byGlennJocherdef__init__(self,c1,c2,k=5):#equivalenttoSPP(k=(5,9,13))super().__init_......
  • 常见问题解决 --- pip报错【WARNING: Retrying (Retry(total=4, connect=None, read=N
    问题现象【WARNING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,st】解决方法:出现该错误信息是因为pip源连接证书验证失败,增加参数 --trusted-host例如pipinstallmatplotlib-ihttp://mirrors.aliyun.com/pypi/simple--trusted-hostmirrors.al......
  • MySQL text类型出现报错 Data truncation: Data too long for column...
    MySQL5.7数据库字段类型为:text 代码中限制了长度为50000 结果出现异常 结论:MySQL5以上版本中varchar类型的长度限制是以字符数为单位的,比如:“你好”是2个字符text类型则是以字节数为单位的,这里我们的数据库字段编码为utf8mb4,每个中文字符占3个字节,所以“你好”是......
  • 爬虫案例之有道翻译execjs改写(JS代码改良版)
    网易有道翻译之逆向破解[execjs代码改写]网址:https://fanyi.youdao.com/index.html#/***用到的知识点:(1)requests模块和session模块,发起请求什么是session对象?该对象和requests模块用法几乎一致.对于在请求过程中产生了cookie的请求如果该请求是使用session发起的,则co......
  • 解决docker search influxdb 报错Error response from daemon: Get "https://index.do
    解决dockersearchinfluxdb报错Errorresponsefromdaemon:Get"https://index.docker.io/v1/search?q=influxdb&n=25":dialtcp:lookupindex.docker.ioon192.168.12.2:53:readudp192.168.12.128:39189->192.168.12.2:53:i/otimeoutdockerpull&......
  • 文本编码处理
    编码识别工具包chardetpipinstallcchardetcchardetimportrequestsimportchardetres=requests.get("https://www.baidu.com/")encoding=chardet.detect(res.content)['encoding']print(res.content.decode(encoding))importrequestsimpor......
  • 对于xml文件里面配置mybatis-spring报错的解决
    问题描述在我在bean的class里面进行查找sqlSessionFactoryBean,发现无论如何也找不到前面的mybatis问题解决在导入这个时:我们还需要导入这个依赖,只是导入mybatis自己爹依赖是不行的,需要导入的是mybatis-spring依赖:<dependency><groupId>org.mybatis</groupId>......
  • 三菱FX3U PID恒速控制变频器实例 编码器测电机转速,
    三菱FX3UPID恒速控制变频器实例编码器测电机转速,当负载变化引起转速变化,PLCPID模拟量控制变频器达到指定转速,形成闭环控制,控制稳定,亲测可用。内容包含plc和触摸屏程序和教程。YID:2316654562314900......