- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个字符串,其中包含当前用户预期能够在键盘上输入的所有字符。对于英语文化中的用户,这将是 26 个大写字母和 26 个小写字母、10 个十进制数字和 30 多个符号。来自其他国家的用户会有一些不同的特征。
我知道用户可以通过多种方式输入他或她的键盘上没有的字符,但我不能假设他们知道如何操作。我正在寻找一组字符,我认为具有当前文化的任何人都应该能够输入这些字符是合理的。如果该集缺少一两个特殊字符,这不是世界末日,但我希望它合理完整。
我可以通过硬编码或使用如下函数快速获取美国英语字符集:
Function GetCharacterSet() As String
Return Enumerable.Range(32, 95).Select(Function(i) Chr(i)).ToArray
End Function
我不确定如何为其他文化可靠地做到这一点。我可以像这样编写函数:
Function GetCharacterSet() As String
Dim chars As New List(Of Char)
For i As Integer = 0 To UInt16.MaxValue
Dim ch As Char = ChrW(i)
If Char.IsLetterOrDigit(ch) OrElse Char.IsPunctuation(ch) OrElse ch = " "c Then
chars.Add(ch)
End If
Next
Return chars.ToArray
End Function
但生成的(很长的)字符串包含在任何 文化中有效的字符。有没有一种方法可以检查字符是否仅在当前 文化中是字母、数字或标点符号?
最佳答案
好吧,这有点倒退,但这是迄今为止我能用键盘布局 API 管理的最好的:
public class Api
{
[DllImport("kernel32.dll")]
public static extern uint GetCurrentThreadId();
[DllImport("user32.dll")]
public static extern IntPtr GetKeyboardLayout(uint idThread);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern short VkKeyScanEx(char ch, IntPtr dwhkl);
}
class Program
{
static bool IsRepresentable(char c, IntPtr keyboardLayout)
{
var x = Api.VkKeyScanEx(c, keyboardLayout);
return x != -1;
}
static IEnumerable<char> GetKeyboardLayoutCharacters(IntPtr keyboardLayout)
{
return
Enumerable.Range(32, char.MaxValue - 32)
.Select(n => (char)n)
.Where(c => IsRepresentable(c, keyboardLayout));
}
static void Main(string[] args)
{
Console.OutputEncoding = Encoding.UTF8;
var layout = Api.GetKeyboardLayout(Api.GetCurrentThreadId());
Console.WriteLine(string.Concat(GetKeyboardLayoutCharacters(layout)));
}
}
这实际上是搜索所有 BMP 并询问每个字符是否可以由给定的键盘布局表示。不理想,但它返回以下内容:
德语:
!"#$%&'()*+,-./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
abcdefghijklmnopqrstuvwxyz
{|}~§°²³´µÄÖÜßäöüẞ€
波兰语:
!"#$%&'()*+,-./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
abcdefghijklmnopqrstuvwxyz
{|}~ÓóĄąĆćĘꣳŃńŚśŹźŻż€
美国英语:
!"#$%&'()*+,-./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
abcdefghijklmnopqrstuvwxyz{|}~
美国国际 ;-):
!"#$%&'()*+,-./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
abcdefghijklmnopqrstuvwxyz
{|}~¡¢£¤¥¦§¨©«¬®°²³´µ¶¹»¼½¾¿ÁÄÅÆÇÉÍÐÑÓÖ×ØÚÜÞßáäåæçéíðñóö÷øúüþ‘’€
我相当确定一定有一种方法可以实际获取给定键盘布局可以产生的字符,因为上面的列表没有考虑死键(例如美国国际实际上可以产生ÿ
、õ
或 ï
但它们不在列表中,因为无法使用 Shift、Ctrl 或 Alt 生成它们——您必须使用死键)。但作为第一个近似值,这可能已经有用了。此外,其中有些东西很奇怪,与其说是包含 U+007F(即 Del),不如说是包含 U+F000 和 U+F001。可能需要对返回列表进行额外过滤。
此方法还假定代表其语言的用户的键盘布局处于事件状态。但是,如果这仅与当前用户的语言有关,这可能是最常见的情况。
编辑:
Vb.Net 版本
Private NotInheritable Class NativeMethods
<DllImport("user32.dll", CharSet:=CharSet.Unicode)>
Public Shared Function VkKeyScanEx(ByVal ch As Char, ByVal dwhkl As IntPtr) As Short
End Function
End Class
<Extension>
Public Function IsAlphabetic(ByVal sender As String,
ByVal culture As CultureInfo) As Boolean
If Not CultureInfo.GetCultures(CultureTypes.InstalledWin32Cultures).Contains(culture) Then
Throw New CultureNotFoundException(paramName:="culture", message:="Culture not installed.")
Else
' Keyboard Layout Handle (HKL)
Dim hkl As IntPtr = InputLanguage.FromCulture(culture).Handle
Dim charList As New List(Of Char)
For index As UShort = 0US To (UShort.MaxValue - 1US)
Dim c As Char = Convert.ToChar(index)
' The check for being a letter can always be removed if symbols or numbers should be allowed, too.
If (NativeMethods.VkKeyScanEx(c, hkl) <> -1S) AndAlso Char.IsLetterOrDigit(c) Then
charList.Add(c)
End If
Next index
For Each c As Char In sender
If Not charList.Contains(c) Then
Return False
End If
Next
Return True
End If
End Function
关于c# - 获取 "belong"到当前文化的字符列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29777125/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!