C#-检测传入字符串的键盘语言

本文关键字:键盘 语言 字符串 检测 C#- | 更新日期: 2023-09-27 18:19:43

我已经为触摸屏构建了一个Windows应用程序,使用FPS Components的FPS Virtual Keyboard for WPF作为我的屏幕键盘。这个键盘有一个按钮,可以在Windows中安装的任何键盘语言中循环使用,整个应用程序的一切都很好。我遇到的问题出现在应用程序的一个方面,它可以链接到运行相同应用程序的其他本地网络面板,并显示从第一个面板输入的一些信息。如果用户将键盘语言切换为阿拉伯语,则发送到远程面板的字符串显示为"????",我认为这是因为语言不匹配。

有没有一种相对简单的方法可以确定使用哪种键盘语言来键入字符串,然后正确显示它?从应用程序的角度来看,接收面板实际上不需要更改其本地键盘设置,所以我更希望无论语言如何都能正确显示传入字符串,除非Windows要求更改本地设置。

这些面板都是在Windows7上运行的。

C#-检测传入字符串的键盘语言

字符串需要记住的一点是它们没有"语言";字符串只是Unicode代码点(即字符)的序列。输入设备的"语言"只是为您提供了一种选择要附加哪些字符的方法。一旦创建了字符串,其内容就独立于系统/线程区域设置或输入设备。您捕获了一些字符,现在它们被不可更改地存储在字符串中。如果有必要的字体可以用来呈现字符串的内容,那么它应该在运行应用程序的任何机器上显示相同。

验证其他机器是否安装了必要的字体应该足够简单——只需用一种会给你带来问题的语言(例如阿拉伯语)输入一些文本,并验证它是否正确呈现。

还要验证您没有根据输入语言手动更改显示面板的字体。WPF的默认UI字体是一种"复合字体",它将Unicode字符空间的子集映射到不同的字体族。换句话说,如果字符串的一部分包含阿拉伯字形,则相应的文本段将以阿拉伯字体显示。您的标准拉丁字形将以系统字体(例如Segoe UI)等显示。这是一个非常有用的功能,如果您覆盖显示面板的字体,您可能会失去这种灵活性。

如果上面的所有内容都被检查出来,并且文本只有在"通过电线"发送时才出现乱码,那么很可能是编码问题。也许您的网络代码正在做一些天真的事情,比如将字符串中的每个char转换为一个单独的byte,这对于标准ASCII范围来说很好,但对于更高的Unicode范围来说却是垃圾。确保使用正确的编解码器(例如,UTF8)对字符串进行编码。