【问题标题】:Best way to transform string to valid encoding in C#在 C# 中将字符串转换为有效编码的最佳方法
【发布时间】:2021-07-16 07:38:33
【问题描述】:

如果您有重复或简单的问题,请提前抱歉!我找不到答案。

我正在使用 Delphi 制作的 dll。可以使用 DLL 将数据发送到设备。但是,在发送数据时,某些字符串不被接受或被写入空白。发送到设备的数据存储在 txt 文件中。它是使用 txt 文件第三方程序生成的。 也就是说,我认为字符串是不确定的格式。如果我以 utf-8 格式发送,它会接收所有信息。但是当时的一些字符串???? ???? 仍然存在。 我的许多文本都使用西里尔字母。 我做了什么:

// string that send to device
[MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 36)]
  public string Name;

当我这样做时,设备只收到了 100 个数据中的 10 个。 如果我使用 UTF-8 编码:

byte[] bytes = Encoding.Default.GetBytes(getDvsName[1].ToString());
string res = Encoding.UTF8.GetString(bytes);

以这种方式获得了所有数据,但是太多的字符串变成了??? ????。 我也试过这样:

static private string Win1251ToUTF8(string source)
{
  Encoding utf8 = Encoding.GetEncoding(«utf-8»);
  Encoding win1251 = Encoding.GetEncoding(«windows-1251»);
  byte[] utf8Bytes = win1251.GetBytes(source);
  byte[] win1251Bytes = Encoding.Convert(win1251, utf8, utf8Bytes);
  source = win1251.GetString(win1251Bytes);
  return source;
}

以上所有方法都没有帮助。我怎样才能以正确的格式接收传入的信息?还有其他方法吗?

【问题讨论】:

  • 如果你想获取字节[]的字符串表示,你会想要使用Convert.ToBase64String。
  • 你试过 Encoding.Unicode 吗? DLL 文档是否表明它使用哪种编码?
  • 听起来您应该通过二进制数据 (byte[]) 而不是字符串与 DLL 进行通信。 “重新编码”字符串总是会丢失,因为当你得到损坏的字符串时,你通常已经丢失了数据。
  • @B.O.B.文档中没有关于编码的内容。在文档中仅包含 public string Name; // Product Name, 36 characters。
  • 好吧,在不知道您尝试与之交互的 API 的情况下,不确定我们能否提供更多帮助。如果没有关于 API 的更多信息,我只能想到一件事:你确定它是 LPSTR 吗? (docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/…) 如果你正在吞噬字符,它可能是其他类似 LPWSTR (docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/…) 的东西。在 .Net 中使用非 .Net DLL 时,有许多不同类型的字符串...

标签: c# dll encoding utf-8


【解决方案1】:

您好,这里出了什么问题,您将字符串编码为默认值而不是 utf8。

string tom = "ටොම් හැන්ක්ස්";

byte[] bytes = Encoding.UTF8.GetBytes(tom);
string res = Encoding.UTF8.GetString(bytes);

【讨论】:

  • 反正结果是一样的。
  • 我测试了它,它确实在我的设备上工作。
猜你喜欢
  • 2012-11-06
  • 1970-01-01
  • 2014-06-21
  • 2010-10-21
  • 2014-01-28
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 2010-10-10
相关资源
最近更新 更多