我正在使用(似乎是)一个ansi(或ascii ??)dll库。 我认为这是因为与lib提供的头文件显示函数使用char *的和LPSTR和LPCSTR和char数组结构。
这个DLL通过:: LoadLibrary从一个cpp / cli类库中加载,该类库封装了它的function并将其公开给c#。 一个C#控制台应用程序和各种其他类库使用此cli库执行操作。
我可以使cli集合ether多字节或Unicode(据我所知在语言支持方面是相同的),并且c#应用程序始终是Unicode。
这个本地dll本质上是一个适当的后端服务器的代理,它将信息从服务器传回。
我遇到的问题是,如果os语言环境(对于没有Unicode应用程序的情况下,其运行的语言设置为特定语言),本机dll lib将只能正确运行特定语言。 即如果我想要应用程序正确使用中文字符,该地区需要设置。 我发现很难理解的是,为什么经纪人的地点是重要的。 据我所知,如果服务器是一个ansi应用程序,如果用户想要存储没有Unicode中文,设置服务器上的语言环境将是有意义的,所以它会在客户端,而不是在中间人,只是通过的东西。 此外,整个事情变得非常混乱。
有没有把Unicode传递给像c + +中的字符数组? 即使在这种情况下工作?
这是我正在考虑的一个场景:
这真的可能吗? 在内存布局方面,它应该,我的意思是字符只是一个字节没有?
我以正确的方式接近这个吗? 有没有更好的方法来完成跨语言支持。 请注意,供应商已经logging在案,表示无法在API中混合使用语言,但这不是我所期待的。 我只是不想在我想支持的每种语言的单独操作系统上运行该软件的实例。
在这种情况下,令人困惑的是DLL的接口是否有问题。 在以下意义上被破坏: 它不支持所有的Unicode码点 。 这与参数的类型无关:char数组非常适合支持所有的unicode。
我们怎么知道呢? 这是因为,根据你,它做什么取决于系统区域设置。
那么该怎么办? 如果DLL源代码不在你的控制之下,你将不会拥有它。 但是,您可以通过设置语言环境来解决一个ANSI代码页的问题。 它不适用于某些语言。
更好的办法是敦促DLL厂商支持unicode。 最好的编码当然是UTF-8 – 这样就不会破坏现有的代码,因为类型LPCSTR保持不变。
我最终使用了这里描述的方法:
是否有可能在Windows中为每个应用程序设置ANSI编码
这是为我工作