出现这种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;
..//略还在毫无思路,请高手帮助下..

解决方案 »

  1.   

    这种情况可能是你调用的dll中有中文字符的出现,可以考虑在英文系统中安装中文常用字体试试。
      

  2.   

    在该英文系统里打开有中文内容的txt,是没问题的。
    关键是以下代码。执行后,不太好解释。   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都是 ??(一个中文对应一个?号)
      

  3.   

    编码问题:

    http://blog.csdn.net/pizi0475/article/details/5346708
    BSTR、LPSTR、LPWSTR、CString、VARIANT、COleVariant 、_variant_t、CComBSTR、_bstr_t