当在Python中运行execjs时遇到编码问题,可能是由于JS代码中使用了非UTF-8编码。为了解决这个问题,您可以尝试以下两种方案
最直接方法需要修改Subprocess中的Enconding 为 "Utf-8"
- 将JS代码转换为UTF-8编码
您可以在JS代码中将所有字符串转换为UTF-8编码。例如,您可以在JS代码文件的开头添加以下语句:
// -*- coding: utf-8 -*-
然后在所有字符串前添加一个“u”前缀以指明它们是Unicode字符串:
var str = u'你好,世界!';
这样,在Python中调用execjs时就不会再遇到编码问题。
- 使用自定义的编解码器
您可以通过编写自定义的编解码器来将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