目前上期技术官方提供的CTP API是C++版本,但在实际使用中不少客户的量化交易系统是Java写的,这就需要有一个JAVA封装CTP API的,可供JAVA直接使用的动态库。
SWIG是一个能将C/C++接口转换为其他语言的工具,目前可以支持Python,Java,R等语言,已有成熟的教程。在用swig生成JAVA版CTP API的过程中,最大的问题莫过于返回值中文乱码问题。
本文主要介绍封装时产生的两类乱码问题,一类是普通回报中的字符串乱码问题,另一类是结算单乱码问题。其中结算单乱码问题对其他编程语言亦有参考意义。
一、普通回报中文乱码
此类型常见的乱码主要存在于 CThostFtdcRspInfoField 结构体中的 ErrorMsg 字段,用于在接口调用存在错误时返回必要参考信息,除此之外,通过结构体 CThostFtdcInstrumentField 获取合约中文名称等信息出现乱码也是常见的乱码问题之一。
具体原因:
1. Java基于Unicode字符集,并有多个类库实现了Unicode标准,运行时内部字符串使用UTF-16,默认使用UTF-8序列化字符串。因此当JNI返回字符串时,应调用NewStringUTF方法(当输入为UTF-8时),或者调用NewString(当输入为UTF-16时)方法,最终生成可以在Java中返回的jstring。
2. CTP官方使用的是国标编码,也就是(GB18030>GBK&g