出现这种C#中调用非託管DLL,本地编码正常,但在英文操作系统struct内的string里中文内容都变为?
第一反应是
在英文操作系统内找不到任何一个字符GB2312的内码,所以中文只能以“?”代替这个字符,用 Encoding.Default.EncodingName.ToString()在英文系统调试输出: Western European (Windows)
注本地正常因为输出是简体中文(GB2312)试过以下二种方式都无效
(1)在struct上添加 [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
本地正常,英文操作系统还是“?”
(2)在struct上添加 [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
本地乱码,英文操作系统乱码。备注:
C
struct UserRecord
{
char name[128]; // name
..//略
C#
public struct UserRecord
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string name;
..//略还在毫无思路,请高手帮助下..
第一反应是
在英文操作系统内找不到任何一个字符GB2312的内码,所以中文只能以“?”代替这个字符,用 Encoding.Default.EncodingName.ToString()在英文系统调试输出: Western European (Windows)
注本地正常因为输出是简体中文(GB2312)试过以下二种方式都无效
(1)在struct上添加 [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
本地正常,英文操作系统还是“?”
(2)在struct上添加 [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
本地乱码,英文操作系统乱码。备注:
C
struct UserRecord
{
char name[128]; // name
..//略
C#
public struct UserRecord
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string name;
..//略还在毫无思路,请高手帮助下..
关键是以下代码。执行后,不太好解释。 UserRecord user = SetRecord.NewRecord();
user.name = szCustomerName; //变量赋值给结构体的name
....//略调相关api做事情 //用记事本保存参数
using (StreamWriter writer = new StreamWriter(Server.MapPath("~/1.txt"), false, Encoding.UTF8))
{
writer.Write(DateTime.Now.ToString() + "\r\n Encoding.Default name:" + Encoding.Default.GetString(Encoding.Default.GetBytes(szCustomerName)) + "\r\n"
+ "EncodingUTF8 name:" + Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(szCustomerName)) + "\r\n"
+ "EncodingUnicode name:" + Encoding.Unicode.GetString(Encoding.Unicode.GetBytes(szCustomerName)) + "\r\n"
+ "读出name:" + user.name + "\r\n"
+ "原值:" + szCustomerName + "\r\n");
}
读出name与Encoding.Default转换输入szCustomerName都是 ??(一个中文对应一个?号)
http://blog.csdn.net/pizi0475/article/details/5346708
BSTR、LPSTR、LPWSTR、CString、VARIANT、COleVariant 、_variant_t、CComBSTR、_bstr_t