【问题标题】:C# convert string Unicode to byte AnsiC# 将字符串 Unicode 转换为字节 Ansi
【发布时间】:2013-08-21 05:13:28
【问题描述】:

谷歌没有像我想要的那样帮助我,所以我在这里写帖子。 我在 C# 和 C 函数(在 dll 中)中有 Unicode 字符串,它们需要 char(ANSI)*。 我试着做

string tmp = "ala ma kota";
unsafe
{
    fixed (byte* data = &tmp.ToCharArray()[0])
    {
        some_function(data);
    }
}

但我无法在没有编码的情况下直接转换。我尝试使用 Encode 类但没有任何效果。我知道, some_function 需要用 char 指针调用。它指向字节数组的位置。

【问题讨论】:

  • “我尝试使用 Encode 类,但没有任何效果” - 证明这一点,因为这是一个主要解决方案。

标签: c# c unicode character-encoding


【解决方案1】:

您不需要自己明确地执行此操作。

相反,使用 P/Invoke 声明 C 方法以接受 string 类型的参数。

然后添加到 P/Invoke 声明中:

 [DllImport("YourDllName.dll", CharSet=CharSet.Ansi)]

然后,编组器会为您将字符串转换为 ANSI。

请注意,我假设字符串被传递给被调用函数,因此参数不是用于从被调用函数返回新字符串的指针。

更多详情请看这里:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.charset.aspx

事实上,默认值为CharSet.Ansi,因此您可能只需将参数声明为string,而不是byte*(或您刚才使用的任何内容)。

【讨论】:

  • 比我的答案好多了。
  • 他可能需要在参数上内联声明 [MarshalAs(UnmanagedType.LPStr)],因为默认字符串封送处理是 UnmanagedType.BStr
  • @SynerCoder - 你不必删除,你有其他方法来解决这个问题。
  • @Matthew - 关于“输出参数”的部分令人困惑,我认为您的意思是“输入参数”。添加(样机)函数声明以明确。
  • @HenkHolterman Urk 好点。我的意思是从调用者的角度来看的输出。
【解决方案2】:

您应该使用System.Text 命名空间:

string tmp = "ala ma kota";
unsafe
{
    fixed (byte* data = &System.Text.Encoding.ASCII.GetBytes(tmp)[0])
    {
        some_function(data);
    }
}

【讨论】:

  • C# 中的所有字符串都是 UTF-16。使用Encode 类将获取特定格式的字节。
  • 就像@Romoku 所说,使用目标编码器。 ASCII.GetBytes()
猜你喜欢
  • 2013-02-05
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多