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

时间:2014-08-28 16:47:02

标签: c# wpf keyboard

我使用FPS虚拟键盘为FPS组件的WPF构建了一个触摸屏的Windows应用程序,作为我的屏幕键盘。这个键盘有一个按钮,用于循环安装在Windows中的任何键盘语言,一切都在整个应用程序中运行良好。我遇到的问题是应用程序的一个方面,它可以链接到运行相同应用程序的其他本地联网面板,并显示从第一个输入的一些信息。如果用户将键盘语言切换为阿拉伯语,发送到远程面板的字符串显示为“?????”,我假设因为语言不匹配。

是否有一种相对简单的方法来确定键入字符串的键盘语言,然后正确显示?从应用程序的角度来看,接收面板不需要实际更改其本地键盘设置,因此我更愿意只是能够正确显示传入的字符串而不管语言,除非Windows要求本地设置更改。

这些面板都在运行Windows 7。

1 个答案:

答案 0 :(得分:2)

要记住字符串的一点是他们没有语言&#34 ;;字符串只是一系列Unicode代码点(即字符)。 "语言"输入设备只是为您提供了一种选择要追加的字符的方法。创建字符串后,其内容独立于系统/线程区域设置或输入设备。你捕获了一些角色,现在他们不可避免地存储在字符串中。如果必要的字体可用于呈现字符串的内容,则它应该在运行应用程序的任何计算机上以相同的方式显示。

它应该很简单,以验证其他机器是否安装了必要的字体 - 只需输入一些给您带来问题的语言(如阿拉伯语),并验证它是否正确呈现。

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

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