当前位置: 首页 > news >正文

南昌企业建站程序百度seo营销公司

南昌企业建站程序,百度seo营销公司,摄影师招聘网站,酒店网站制作公司0 .NET 字符集编解码 .Net 内部使用的字符集是Unicode,如果需要编码为其他诸如GBK、UTF8编码,可以通过Encoding 类来实现。 using System.Text;void PrintBytes(byte[] bytes) {foreach (var b in bytes){Console.Write("{0:X} ", b);}Conso…

0 .NET 字符集编解码

.Net 内部使用的字符集是Unicode,如果需要编码为其他诸如GBK、UTF8编码,可以通过Encoding 类来实现。

using System.Text;void PrintBytes(byte[] bytes)
{foreach (var b in bytes){Console.Write("{0:X} ", b);}Console.WriteLine();
}Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);string str = "主账号";var gbkBytes = Encoding.GetEncoding("gbk").GetBytes(str);       //获取GBK编码
var utf8Bytes = Encoding.UTF8.GetBytes(str);                    //获取UTF8编码
var unicodeBytes = Encoding.Unicode.GetBytes(str);              //获取Unicode编码PrintBytes(gbkBytes);
PrintBytes(utf8Bytes);
PrintBytes(unicodeBytes);var gbkStr = Encoding.GetEncoding("gbk").GetString(gbkBytes);   //使用GBK解码
var utf8Str = Encoding.UTF8.GetString(utf8Bytes);               //使用UTF8解码
var unicodeStr = Encoding.Unicode.GetString(unicodeBytes);      //使用Unicode解码Console.WriteLine(gbkStr);
Console.WriteLine(utf8Str);
Console.WriteLine(unicodeStr);

输出:

D6 F7 D5 CB BA C5
E4 B8 BB E8 B4 A6 E5 8F B7
3B 4E 26 8D F7 53
主账号
主账号
主账号

在使用C++API时,当遇到字符串处理时难免会需要处理字符编码的问题。这里主要针对于使用C++ API是遇到的一些编码被封送的情况测试。

1 Windows环境下

这里首先测试了.Net 在Windows环境下运行情况下,.Net 默认使用ANSI 编解码,其中在 DllImport 中指定的 CharSet 对导出函数的直接字符串参数生效。CharSet 取值与C++ API 端接收到的字符串情况对应如下:

1.1 请求函数:C# => C++

1.1.1 测试函数字符串参数编码

输入文字:主账号

CharSetC++API端接收到的字符集输出Byte值
不设置GBKD6 F7 D5 CB BA C5 
AnsiGBKD6 F7 D5 CB BA C5 
UnicodeUnicode3B 4E 26 8D F7 53 
AutoUnicode3B 4E 26 8D F7 53 
NoneGBKD6 F7 D5 CB BA C5 

测试接口代码:

    //对这个接口分别设置为以下5种情况进行测试[DllImport(LibName, CallingConvention = CallingConvention.StdCall)]public static extern void RegisterFront(string ip, int port);[DllImport(LibName, CharSet=CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]public static extern void RegisterFront(string ip, int port);[DllImport(LibName, CharSet=CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]public static extern void RegisterFront(string ip, int port);[DllImport(LibName, CharSet=CharSet.Auto, allingConvention = CallingConvention.StdCall)]public static extern void RegisterFront(string ip, int port);[DllImport(LibName, CharSet=CharSet.None, CallingConvention = CallingConvention.StdCall)]public static extern void RegisterFront(string ip, int port);
1.1.2 测试函数结构体参数中的字符串编码

在这个 DllImport 中设置的CharSet 仅对接口函数的直接字符串类型生效。如果参数是一个对象,而对象中的字符串类型需要在定义封装对象的位置,通过StructLayout 属性的CharSet 来设置。我这里测试下来,CharSet 取值与C++ API 端接收到的字符串情况对应如下:

输入文字:主账号

CharSetC++API端接收到的字符集输出Byte值
不设置GBKD6 F7 D5 CB BA C5 
AnsiGBKD6 F7 D5 CB BA C5 
Unicodenull
Autonull
NoneGBKD6 F7 D5 CB BA C5 

跟上面类似,但是Unicode 传送的不成功,想必是类型问题,Unicode 对应C++中应该对应使用wchar* 数组。

测试接口及定义结构体的代码:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public class StepReqAddPrimaryAccount
{[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]public string? TradingDay;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string? PrimaryAccountID;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? PrimaryAccountName;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? BrokerPassword;public int ChannelID;public bool IsAllowLogin;public AccountStatusType AccountStatus;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? Password;public int RiskGroupID;public int CommissionGroupID;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class StepReqUpdatePrimaryAccount
{[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]public string? TradingDay;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string? PrimaryAccountID;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? PrimaryAccountName;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? BrokerPassword;public int ChannelID;public bool IsAllowLogin;public AccountStatusType AccountStatus;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? Password;public int RiskGroupID;public int CommissionGroupID;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.None)]
public class StepReqAddAccount
{[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]public string? TradingDay;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string? AccountID;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? AccountName;public AccountStatusType AccountStatus;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? Password;public int TradeGroupID;public int RiskGroupID;public int CommissionGroupID;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class StepReqUpdateAccount
{[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]public string? TradingDay;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string? AccountID;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? AccountName;public AccountStatusType AccountStatus;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? Password;public int TradeGroupID;public int RiskGroupID;public int CommissionGroupID;
}
	[DllImport(LibName, CharSet=CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]public static extern int ReqAddPrimaryAccount(StepReqAddPrimaryAccount reqAddPrimaryAccount, int requestID);[DllImport(LibName, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]public static extern int ReqUpdatePrimaryAccount(StepReqUpdatePrimaryAccount reqUpdatePrimaryAccount, int requestID);[DllImport(LibName, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int ReqAddAccount(StepReqAddAccount reqAddAccount, int requestID);[DllImport(LibName, CharSet = CharSet.None, CallingConvention = CallingConvention.StdCall)]public static extern int ReqUpdateAccount(StepReqUpdateAccount reqUpdateAccount, int requestID);

1.2 回调函数:C++ => C#

返回值:正确

C++中编码:GBK

CharSetC#回调函数接收到字符集解码情况
不设置GBK正确
AnsiGBK正确
Unicodenull乱码
Autonull乱码
NoneGBK正确

C++中编码:Utf8

相关测试代码:

//依次将CharSet 设置为:不设置值、Ansi、Unicode、Auto、None,进行测试
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public class StepRspInfo
{public int ErrorID;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]public string? ErrorMsg;
}

回调委托定义:

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void OnRspAdminUserLogin(StepRspAdminUserLogin? rspAdminUserLogin, StepRspInfo? rspInfo, int requestID, bool isLast);

2 Linux环境下

2.1 请求函数: C# => C++

2.1.1 测试函数字符串参数编码

 输入文字:主账号

CharSetC++API端接收到的字符集输出Byte值
不设置UTF8E4 B8 BB E8 B4 A6 E5 8F B7
AnsiUTF8E4 B8 BB E8 B4 A6 E5 8F B7
UnicodeUnicode3B 4E 26 8D F7 53
AutoUTF8E4 B8 BB E8 B4 A6 E5 8F B7
NoneUTF8E4 B8 BB E8 B4 A6 E5 8F B7

测试接口代码:

    //对这个接口分别设置为以下5种情况进行测试[DllImport(LibName, CallingConvention = CallingConvention.StdCall)]public static extern void RegisterFront(string ip, int port);[DllImport(LibName, CharSet=CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]public static extern void RegisterFront(string ip, int port);[DllImport(LibName, CharSet=CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]public static extern void RegisterFront(string ip, int port);[DllImport(LibName, CharSet=CharSet.Auto, allingConvention = CallingConvention.StdCall)]public static extern void RegisterFront(string ip, int port);[DllImport(LibName, CharSet=CharSet.None, CallingConvention = CallingConvention.StdCall)]public static extern void RegisterFront(string ip, int port);
2.1.2 测试函数结构体参数中的字符串编码

通过StructLayout 属性的CharSet 来设置结构体中的字符串编码,CharSet 取值与C++ API 端接收到的字符串情况对应如下:

输入文字:主账号

CharSetC++API端接收到的字符集输出Byte值
不设置UTF8E4 B8 BB E8 B4 A6 E5 8F B7
AnsiUTF8E4 B8 BB E8 B4 A6 E5 8F B7
Unicodenull
AutoUTF8E4 B8 BB E8 B4 A6 E5 8F B7
NoneUTF8E4 B8 BB E8 B4 A6 E5 8F B7

跟上面类似,但是Unicode 传送的不成功,想必是类型问题,Unicode 对应C++中应该对应使用wchar* 数组。

测试接口及定义结构体的代码:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public class StepReqAddPrimaryAccount
{[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]public string? TradingDay;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string? PrimaryAccountID;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? PrimaryAccountName;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? BrokerPassword;public int ChannelID;public bool IsAllowLogin;public AccountStatusType AccountStatus;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? Password;public int RiskGroupID;public int CommissionGroupID;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class StepReqUpdatePrimaryAccount
{[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]public string? TradingDay;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string? PrimaryAccountID;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? PrimaryAccountName;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? BrokerPassword;public int ChannelID;public bool IsAllowLogin;public AccountStatusType AccountStatus;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? Password;public int RiskGroupID;public int CommissionGroupID;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.None)]
public class StepReqAddAccount
{[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]public string? TradingDay;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string? AccountID;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? AccountName;public AccountStatusType AccountStatus;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? Password;public int TradeGroupID;public int RiskGroupID;public int CommissionGroupID;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class StepReqUpdateAccount
{[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]public string? TradingDay;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string? AccountID;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? AccountName;public AccountStatusType AccountStatus;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string? Password;public int TradeGroupID;public int RiskGroupID;public int CommissionGroupID;
}
	[DllImport(LibName, CharSet=CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]public static extern int ReqAddPrimaryAccount(StepReqAddPrimaryAccount reqAddPrimaryAccount, int requestID);[DllImport(LibName, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]public static extern int ReqUpdatePrimaryAccount(StepReqUpdatePrimaryAccount reqUpdatePrimaryAccount, int requestID);[DllImport(LibName, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int ReqAddAccount(StepReqAddAccount reqAddAccount, int requestID);[DllImport(LibName, CharSet = CharSet.None, CallingConvention = CallingConvention.StdCall)]public static extern int ReqUpdateAccount(StepReqUpdateAccount reqUpdateAccount, int requestID);

 2.2 回调函数: C++ => C#

 返回值:正确

C++中编码:GBK

CharSetC#解码情况
不设置乱码
Ansi乱码
Unicode乱码
Auto乱码
None乱码

C++中编码:Utf8

相关测试代码:

//依次将CharSet 设置为:不设置值、Ansi、Unicode、Auto、None,进行测试
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public class StepRspInfo
{public int ErrorID;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]public string? ErrorMsg;
}

回调委托定义:

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void OnRspAdminUserLogin(StepRspAdminUserLogin? rspAdminUserLogin, StepRspInfo? rspInfo, int requestID, bool isLast);

3 结论

当在与C++ API 交互时,如果在windows平台运行,建议使用GBK编码进行通信;而在Linux平台运行的话,建议使用 UTF8编码进行通信。

http://www.mmbaike.com/news/85887.html

相关文章:

  • 做纺织都有那些好网站广告宣传费用一般多少
  • 那个公司可以做网站百度指数查询官方下载
  • 苏州网站建设-中国互联梧州网站seo
  • 自己做的网站可以发布吗关键词的选取原则
  • 怎么在网站做系统福州seo推广外包
  • 天河建设网站系统舆情分析
  • 查看网站是什么语言做的网盘资源共享群吧
  • 做酒店的网站企业培训课程价格
  • 中智软件开发有限公司seo系统优化
  • 临夏州建设厅官方网站惠州百度seo地址
  • 网页设计与制作课程的建设历程app优化推广
  • 青岛主流网站seo优化大公司排名
  • 重庆招标建设信息网站互联网营销推广
  • 广告传媒网站模板长春seo优化
  • 手机自助建站平台线上推广有哪些
  • 佛山禅城百度网站优化软件
  • 做平台网站需要多少钱想要推广网页正式版
  • 网站空间有什么用网络推广方法有哪几种
  • dw做网站基础广告点击一次多少钱
  • 免费域名解析网站建设网络营销的特点是什么?
  • 六灶网站建设做网站用什么编程软件
  • 做网站几个步骤谷歌sem服务商
  • 设计专业知名企业网站友情链接又称
  • 动态域名做网站班级优化大师官方网站
  • android 解析 wordpress石家庄seo关键词
  • 进出长春最新规定济南新站seo外包
  • 网站建设黄页吉林网络推广公司
  • 深圳网站建设易佰讯搜索引擎优化的基本原理
  • 学校网站搭建百度seo培训班
  • 自己怎么做点击量好的网站今天中国新闻