vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 12
声望: 0

尝试连接易盛,发现获取用户名(TapAPIQuotLoginRspInfo.UserName)时 老是报错: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 0: invalid start byte,本地工程师utf-8编码。大神们如何解决啊?

Administrator
avatar
加入于:
帖子: 2152
声望: 99

请提供下完整的报错截图?

Member
avatar
加入于:
帖子: 12
声望: 0

用Python的交易员 wrote:

请提供下完整的报错截图?
1、代码修改,仅是在交易api的OnRspLogin中添加self.investor_name = info.UserName,获取用户名。
测试info本身没有问题,UserNo都能获取到。只是用户名是中文,所以报错。
2、错误提示如下(调整了tap_gateway的位置):
2019-08-01 11:11:22,201 INFO: 交易服务器连接成功
发生内部错误,位置:
<examples.no_ui.gateway.tap.tap_gateway.TradeApi object at 0x000001CAFD966D58>.OnRspLogin,详细信息:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 0: invalid start byte
At:
D:\project\vnpy-2.0.5\examples\no_ui\gateway\tap\tap_gateway.py(418): OnRspLogin

备注:修改代码
def OnRspLogin(self, errorCode: int, info: TapAPITradeLoginRspInfo):
"""
Callback of login request.
"""
self.investor_name = info.UserName
if errorCode != TAPIERROR_SUCCEED:
self.gateway.write_log(f"交易服务器登录失败:{error_to_str(errorCode)}")
else:
self.gateway.write_log("交易服务器登录成功")
self.info = info

Administrator
avatar
加入于:
帖子: 2152
声望: 99

加个bytes试试,可能还要用encode或者decode解码

self.investor_name = bytes(info.UserName)
Member
avatar
加入于:
帖子: 12
声望: 0

用Python的交易员 wrote:

加个bytes试试,可能还要用encode或者decode解码

self.investor_name = bytes(info.UserName)

非常感谢,我一度怀疑是本地编码的问题导致,因此也做了很多尝试,报的错误都是UnicodeDecodeError: 'utf-8'。。。。
我尝试过:
1、直接print;
2、info.UserName.encode(),不同编码尝试,空参数等;

                  ```
                info.UserName.encode("gbk")  #无print,赋值等,报同样的错误
                if errorCode != TAPIERROR_SUCCEED:
                     self.gateway.write_log(f"交易服务器登录失败:{error_to_str(errorCode)}")
                else:
                     self.gateway.write_log("交易服务器登录成功")
              ```

3、bytes(info.UserName,encoding=""),不同编码,理论上同str.encode();
4、chardet.detect(info.UserName.encode())等;
5、除去我添加获取用户名代码后,debug该程序,查看info对象下info.UserName值情况,并非预想的乱码信息,而同样是'utf-8' codec can't decode byte 0xb2
因为刚刚接触vnpy,不是特别懂,想问一下:是不是OnRspLogin接收柜台返回值 info: TapAPITradeLoginRspInfo的时候,就出现编码格式出了问题,导致基于框架二次开发,没办法处理。如果单纯是乱码问题,至少print或者debug看到是个乱码,而是任何加工处理都提示UnicodeDecodeError: 'utf-8'

Member
avatar
加入于:
帖子: 12
声望: 0

wrote:

用Python的交易员 wrote:

加个bytes试试,可能还要用encode或者decode解码

self.investor_name = bytes(info.UserName)

非常感谢,我一度怀疑是本地编码的问题导致,因此也做了很多尝试,报的错误都是UnicodeDecodeError: 'utf-8'。。。。
我尝试过:
1、直接print;
2、info.UserName.encode(),不同编码尝试,空参数等;

                  ```
                info.UserName.encode("gbk")  #无print,赋值等,报同样的错误
                if errorCode != TAPIERROR_SUCCEED:
                     self.gateway.write_log(f"交易服务器登录失败:{error_to_str(errorCode)}")
                else:
                     self.gateway.write_log("交易服务器登录成功")
              ```

3、bytes(info.UserName,encoding=""),不同编码,理论上同str.encode();
4、chardet.detect(info.UserName.encode())等;
5、除去我添加获取用户名代码后,debug该程序,查看info对象下info.UserName值情况,并非预想的乱码信息,而同样是'utf-8' codec can't decode byte 0xb2
因为刚刚接触vnpy,不是特别懂,想问一下:是不是OnRspLogin接收柜台返回值 info: TapAPITradeLoginRspInfo的时候,就出现编码格式出了问题,导致基于框架二次开发,没办法处理。如果单纯是乱码问题,至少print或者debug看到是个乱码,而是任何加工处理都提示UnicodeDecodeError: 'utf-8'

另外测试gbk汉字,显示成utf-8,然后解析正确汉字,但是上述问题,无论如何操作都会出现UnicodeDecodeError: 'utf-8'的错误

    test = "娴嬭瘯缂栫爜"
    # print(chardet.detect(bytes(test,encoding="gbk")))
    test1 = bytes(test,encoding="gbk").decode("utf-8")
    test2 = test.encode("gbk").decode("utf-8")
    print(test1)
    print(test2)
D:\vnstudio\python.exe D:/project/vnpy-2.0.5/examples/no_ui/run5.py
测试编码
测试编码
Member
avatar
加入于:
帖子: 12
声望: 0

wrote:

尝试连接易盛,发现获取用户名(TapAPIQuotLoginRspInfo.UserName)时 老是报错: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 0: invalid start byte,本地工程师utf-8编码。大神们如何解决啊?

经过几天调查发现,应该TapAPITradeLoginRspInfo(和TapAPIQuotLoginRspInfo)对象中UserName定义的str类型,
柜台返回是中文且gbk编码,但vnstudio(python3.7)系统默认编码是utf-8,并且str是按照Unicode存储的,给UserName赋值时自动按utf-8解码后再存储,
所以vn框架封装并实现的TapAPITradeLoginRspInfo对象中UserName值,本身存储就存在了问题(无法把gbk的decode成utf-8),二次开发无法解决。
尝试以下两个方案:
1、修改vnstudio的系统默认编码,没有找到好的办法,包括修改环境变量、设置sys.stdout什么的,都不好用;
2、修改TapAPITradeLoginRspInfo对象中时UserName定义,改成bytes,但是修改vntap_ITapTrade.pyi文件不起作用;
应该vntap.pyd使用时还是按str处理的,导致把gbk的decode成utf-8的错误。
不知道大神谁有更好的方法,或者能够修改vnstudio的系统默认编码。

Administrator
avatar
加入于:
帖子: 8
声望: 1

感谢你的反馈,这个问题是封装时编码没设置正确导致的。
已经被记下了。将会很快被修复。

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3