无 Unicode 库和窗口区域设置
None Unicode library and windows locale
我正在使用(似乎是)一个 ansi(或 ascii??) dll 库。我认为之所以如此,是因为随 lib 提供的头文件显示了使用 char* 和 LPSTR 和 LPCSTR 以及带有 char 数组的结构的功能。
此 dll 通过 ::LoadLibrary 从 cpp/cli 类库中加载,该类库包装其功能并将其公开给 c#。C# 控制台应用和各种其他类库使用此 cli 库来执行操作。
我可以使 cli 程序集以太多字节或 Unicode(据我所知,在语言支持方面是相同的),并且 c# 应用程序始终是 Unicode。
这个本机 dll 本质上是专有后端服务器的代理,它
从服务器传递信息并传递到服务器。我遇到的问题是,本机 dll lib 只有在操作系统区域设置(对于非 Unicode 应用程序)设置为该特定语言的情况下才能针对特定语言正常运行。即,如果我希望应用程序正确使用中文字符,则需要设置该区域设置。我发现很难理解的是为什么区域设置对经纪人很重要。我知道,如果服务器是一个 ansi 应用程序,如果用户想在其上存储任何 Unicode 中文,那么在服务器上设置区域设置是有意义的,因此它会在客户端中,但不是在只是传递东西的中间人中。此外,整个事情变得非常混乱。
是否可以将 Unicode 传递给 c++ 中的字符数组之类的东西?在这种情况下甚至有效吗?
这是我正在考虑的一个场景:
- C# 应用获取 URL 编码的字符串
- C# 应用解码字符串并将其传递给 CLI
- cli 以某种方式转换字符串^(或者它应该是 byte[] 在这一点)到 char[] 并将其传递给本机库
这真的可能吗?就内存布局而言,它应该,我的意思是 char 只是一个字节不是吗?
我这样做的方式是否正确? 有没有更好的方法来完成跨语言支持。请注意,供应商记录在案,说没有办法在 API 中混合语言,但这不是我想要的。我只是不想在我想要支持的每种语言的单独操作系统上运行该软件的实例。
在这种情况下,令人困惑的是DLL的接口损坏。在以下意义上被破坏:它不支持所有的Unicode代码点。这与参数的类型无关:char 数组非常适合支持所有 unicode。
我们怎么知道呢?这是因为,根据您的说法,它的作用取决于系统区域设置。
那么,该怎么办呢?如果 DLL 源代码不受您的控制,您将不会拥有它。但是,您可以通过设置区域设置来解决一个 ANSI 代码页的问题。它不适用于某些语言。
最好是敦促DLL供应商支持Unicode。当然,最好的编码是 UTF-8 - 这样它就不会破坏现有代码,因为 LPCSTR 类型保持不变。
我最终使用了这里描述的方法:
是否可以在窗口中为每个应用程序设置 ANSI 编码
这就是对我有用的
- 在 Linux 中存储区域设置名称的缓冲区大小应该是多少?
- 提升区域设置规范化带状字符,但不规范化重音
- 是否有任何区域设置会影响宽字符编码?
- 提升获取文本的区域设置"Conversion failed"
- 提升 1.41.0 : 提升::区域设置替代方案?
- std::locale 向"en_US.UTF-8"区域设置抛出runtime_error异常
- 默认情况具有哪个区域设置
- 区域设置是否有定义负号的方面?
- QT 将文本翻译成特定的区域设置
- 我可以强制 QFileDialog 使用系统区域设置而不是系统语言吗?
- 如何调用 GetAltMonthNames 来填充外部区域设置月份字符串的安全数组
- 提升区域设置不完整类型boundary_indexing<char32_t>
- 默认区域设置"root"在 ICU 中如何工作?
- std::regex总是可以识别区域设置吗?
- std::string 的运算符<是否应该受到当前区域设置的影响?
- C++为任何区域设置区域设置
- 如何显示与系统不同的区域设置的QDate月
- C++获取用户首选的编码或区域设置编码
- 使用cstring.format()中区域设置的小数分离器
- 当区域设置需要"3,14"时,如何使用scanf解析像"3.14"这样的数字