1

我正在使用(似乎是)ansi(或 ascii??) dll 库。我认为是这样的,因为 lib 提供的头文件显示了使用 char* 和 LPSTR 和 LPCSTR 的函数以及带有 char 数组的结构。

这个 dll 是通过 ::LoadLibrary 从一个 cpp/cli 类库中加载的,该类库包装了它的功能并将其公开给 c#。c# 控制台应用程序和各种其他类库使用此 cli 库来执行操作。

我可以制作 cli 程序集 ether mutibyte 或 Unicode(据我所知,在语言支持方面是相同的),并且 c# 应用程序始终是 Unicode。

这个本地 dll 本质上是一个适当的后端服务器的代理,它在服务器之间来回传递信息。

我遇到的问题是,如果操作系统语言环境(对于非 Unicode 应用程序)将其运行设置为该特定语言,则本机 dll 库只能针对特定语言正确运行。即,如果我希望应用程序正确使用中文字符,则需要设置该区域设置。我发现难以理解的是为什么区域设置对经纪人很重要。我知道,如果服务器是 ansi 应用程序,如果用户不想在其上存储任何 Unicode 中文,则在服务器上设置区域设置是有意义的,因此它会在客户端中,但不是在只是传递事情的中间人中。此外,整个事情变得非常混乱。

是否可以将 Unicode 传递给 c++ 中的 char 数组之类的东西?在这种情况下甚至可以工作吗?

这是我正在考虑的一个场景:

  • c# app获取url编码的字符串
  • c# app解码字符串并将其传递给cli
  • cli以某种方式将String^(或者此时应该是byte [])转换为char []并将其传递给本机lib

这真的有可能吗?就内存布局而言,我的意思是 char 只是一个字节,不是吗?

我以正确的方式接近这个吗?有没有更好的方法来完成跨语言支持。请注意,供应商在记录中说无法在 api 中混合语言,但这不是我想要的。我只是不想为我想要支持的每种语言在单独的操作系统上运行软件实例。

4

2 回答 2

1

在这种情况下令人困惑的是,DLL 的接口已损坏。在以下意义上被打破:它不支持所有的 Unicode 代码点。这与参数的类型无关:char 数组非常适合支持所有 unicode。

我们怎么知道呢?这是因为,根据您的说法,它的作用取决于系统区域设置。

那么该怎么办?如果 DLL 源代码不在您的控制之下,您将不会拥有它。但是,您可以通过设置语言环境来解决一个 ANSI 代码页的问题。它不适用于某些语言。

最好是敦促 DLL 供应商支持 unicode。最好的编码当然是 UTF-8 - 这样它就不会破坏现有代码,因为 LPCSTR 类型保持不变。

于 2013-02-02T09:11:55.693 回答
0

我最终使用了这里描述的方法:

是否可以在 Windows 中为每个应用程序设置 ANSI 编码

这对我有用

于 2013-02-03T05:17:13.830 回答