C#中调用非託管DLL,本地编码正常,但在英文操作系统struct内的string里中文内容都变为?,高手帮助啊!!

遊戲王千金 2013-03-14 03:54:18
出现这种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;
..//略

还在毫无思路,请高手帮助下..
...全文
133 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
遊戲王千金 2013-03-14
  • 打赏
  • 举报
回复
在该英文系统里打开有中文内容的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都是 ??(一个中文对应一个?号)
lanymy 2013-03-14
  • 打赏
  • 举报
回复
里面有中文 英文系统不认识中文 成乱码了 英文系统里 装中文就好了 界面还用英文就行 不影响
Architecture Net 2013-03-14
  • 打赏
  • 举报
回复
这种情况可能是你调用的dll中有中文字符的出现,可以考虑在英文系统中安装中文常用字体试试。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧