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时就不会再遇到编码问题。

posted @ 2023-05-15 13:32  这人穷的很  阅读(874)  评论(0编辑  收藏  举报