【问题标题】:How to get an "English name" for a character?如何获得一个角色的“英文名”?
【发布时间】:2012-02-14 10:09:15
【问题描述】:

我只是使用这个最有用的链接:How do I check if a given string is a legal / valid file name under Windows?

在一些验证代码中,我有一些看起来像的东西(忽略我没有使用 StringBuilder 类并忽略形成消息的错误(不需要多次告诉他们关于“冒号”)如果它多次出现在字符串中)):

string InvalidFileNameChars = new string(Path.GetInvalidFileNameChars());
Regex ContainsABadChar = new Regex("[" + Regex.Escape(InvalidFileNameChars) + "]");

MatchCollection BadChars = ContainsABadChar.Matches(txtFileName.Text);
if (BadChars.Count > 0)
{
    string Msg = "The following invalid characters were detected:\r\n\r\n";
    foreach (Match Bad in BadChars)
    {
        Msg += Bad.Value + "\r\n";
    }
    MessageBox.Show(Msg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    return;
}

MessageBox 看起来像(使用找到冒号的示例):

-- 开始--

检测到以下无效字符:

-- 结束--

我想这样说:

-- 开始--

检测到以下无效字符:

冒号 -> :

-- 结束--

我喜欢有英文名字。不是杀手,但很好奇那里是否有一些功能(对于 Char 类不存在,但可能存在于我不考虑的其他类中):

Char.GetEnglishName(':');

【问题讨论】:

  • 你试过自己写函数吗?
  • @DanielA.White 我不确定他是否想要 Unicode,但这是很多字符。 Program Charmap 确实有这些数据。
  • :) Char.GetEnglishName(':');我希望会有这样的方法
  • 但是看看他改编的代码,但只有 6 个无效字符,所以编写自己的代码并不太难。在任何情况下。我认为这是一个很好的问题,您如何获得这些数据?
  • @ShoaibShaikh 但也许更好的是Char.GetName(':', culture)

标签: c# .net char character


【解决方案1】:

如果您不需要考虑每个字符,您可以只使用basic latin and controls unicode block

您可以将表格定义为一个简单的字符串数组,以便快速查找:

string[] lookup = new string[128];
lookup[0x00]="Null character";
lookup[0x01]="Start of Heading";
lookup[0x02]="Start of Text";
lookup[0x03]="End-of-text character";
lookup[0x04]="End-of-transmission character";
lookup[0x05]="Enquiry character";
lookup[0x06]="Acknowledge character";
lookup[0x07]="Bell character";
lookup[0x08]="Backspace";
lookup[0x09]="Horizontal tab";
lookup[0x0A]="Line feed";
lookup[0x0B]="Vertical tab";
lookup[0x0C]="Form feed";
lookup[0x0D]="Carriage return";
lookup[0x0E]="Shift Out";
lookup[0x0F]="Shift In";
lookup[0x10]="Data Link Escape";
lookup[0x11]="Device Control 1";
lookup[0x12]="Device Control 2";
lookup[0x13]="Device Control 3";
lookup[0x14]="Device Control 4";
lookup[0x15]="Negative-acknowledge character";
lookup[0x16]="Synchronous Idle";
lookup[0x17]="End of Transmission Block";
lookup[0x18]="Cancel character";
lookup[0x19]="End of Medium";
lookup[0x1A]="Substitute character";
lookup[0x1B]="Escape character";
lookup[0x1C]="File Separator";
lookup[0x1D]="Group Separator";
lookup[0x1E]="Record Separator";
lookup[0x1F]="Unit Separator";
lookup[0x20]="Space";
lookup[0x21]="Exclamation mark";
lookup[0x22]="Quotation mark";
lookup[0x23]="Number sign";
lookup[0x24]="Dollar sign";
lookup[0x25]="Percent sign";
lookup[0x26]="Ampersand";
lookup[0x27]="Apostrophe";
lookup[0x28]="Left parenthesis";
lookup[0x29]="Right parenthesis";
lookup[0x2A]="Asterisk";
lookup[0x2B]="Plus sign";
lookup[0x2C]="Comma";
lookup[0x2D]="Hyphen-minus";
lookup[0x2E]="Full stop";
lookup[0x2F]="Slash";
lookup[0x30]="Digit Zero";
lookup[0x31]="Digit One";
lookup[0x32]="Digit Two";
lookup[0x33]="Digit Three";
lookup[0x34]="Digit Four";
lookup[0x35]="Digit Five";
lookup[0x36]="Digit Six";
lookup[0x37]="Digit Seven";
lookup[0x38]="Digit Eight";
lookup[0x39]="Digit Nine";
lookup[0x3A]="Colon";
lookup[0x3B]="Semicolon";
lookup[0x3C]="Less-than sign";
lookup[0x3D]="Equal sign";
lookup[0x3E]="Greater-than sign";
lookup[0x3F]="Question mark";
lookup[0x40]="At sign";
lookup[0x41]="Latin Capital letter A";
lookup[0x42]="Latin Capital letter B";
lookup[0x43]="Latin Capital letter C";
lookup[0x44]="Latin Capital letter D";
lookup[0x45]="Latin Capital letter E";
lookup[0x46]="Latin Capital letter F";
lookup[0x47]="Latin Capital letter G";
lookup[0x48]="Latin Capital letter H";
lookup[0x49]="Latin Capital letter I";
lookup[0x4A]="Latin Capital letter J";
lookup[0x4B]="Latin Capital letter K";
lookup[0x4C]="Latin Capital letter L";
lookup[0x4D]="Latin Capital letter M";
lookup[0x4E]="Latin Capital letter N";
lookup[0x4F]="Latin Capital letter O";
lookup[0x50]="Latin Capital letter P";
lookup[0x51]="Latin Capital letter Q";
lookup[0x52]="Latin Capital letter R";
lookup[0x53]="Latin Capital letter S";
lookup[0x54]="Latin Capital letter T";
lookup[0x55]="Latin Capital letter U";
lookup[0x56]="Latin Capital letter V";
lookup[0x57]="Latin Capital letter W";
lookup[0x58]="Latin Capital letter X";
lookup[0x59]="Latin Capital letter Y";
lookup[0x5A]="Latin Capital letter Z";
lookup[0x5B]="Left Square Bracket";
lookup[0x5C]="Backslash";
lookup[0x5D]="Right Square Bracket";
lookup[0x5E]="Circumflex accent";
lookup[0x5F]="Low line";
lookup[0x60]="Grave accent";
lookup[0x61]="Latin Small Letter A";
lookup[0x62]="Latin Small Letter B";
lookup[0x63]="Latin Small Letter C";
lookup[0x64]="Latin Small Letter D";
lookup[0x65]="Latin Small Letter E";
lookup[0x66]="Latin Small Letter F";
lookup[0x67]="Latin Small Letter G";
lookup[0x68]="Latin Small Letter H";
lookup[0x69]="Latin Small Letter I";
lookup[0x6A]="Latin Small Letter J";
lookup[0x6B]="Latin Small Letter K";
lookup[0x6C]="Latin Small Letter L";
lookup[0x6D]="Latin Small Letter M";
lookup[0x6E]="Latin Small Letter N";
lookup[0x6F]="Latin Small Letter O";
lookup[0x70]="Latin Small Letter P";
lookup[0x71]="Latin Small Letter Q";
lookup[0x72]="Latin Small Letter R";
lookup[0x73]="Latin Small Letter S";
lookup[0x74]="Latin Small Letter T";
lookup[0x75]="Latin Small Letter U";
lookup[0x76]="Latin Small Letter V";
lookup[0x77]="Latin Small Letter W";
lookup[0x78]="Latin Small Letter X";
lookup[0x79]="Latin Small Letter Y";
lookup[0x7A]="Latin Small Letter Z";
lookup[0x7B]="Left Curly Bracket";
lookup[0x7C]="Vertical bar";
lookup[0x7D]="Right Curly Bracket";
lookup[0x7E]="Tilde";
lookup[0x7F]="Delete";

那么,你需要做的就是:

var englishName = lookup[(int)'~'];

或者:

 public static string ToEnglishName(this char c)
 {
    int i = (int)c;
    if( i < lookup.Length )
       return lookup[i];
    return "Unknown";
 }

 var name = ':'.ToEnglishName(); // Colon

【讨论】:

  • 太棒了。到目前为止,它已经落到了你和绿色复选标记的基础上。我刚刚投了赞成票。
  • 虽然底座首先回答了问题,但您还是付出了更多努力(剪切粘贴!)。给你的绿色复选标记!
【解决方案2】:

您将遇到的问题是您需要能够表示 Unicode 空间,这将是很大的。如果您真的想这样做,请将this page 的内容放入 Dictionary 然后在 char 上使用此扩展方法:

public static string ToName(this char c)
{
    string result = ""; // or "unknown" or null or whatever
    _charToName.TryGetValue(c, out result);
    return result;
}

// ...

string name = c.ToName();

【讨论】:

  • 没有理由初始化结果。 TryGetValue 如果找不到键,会将其设置为 null。
  • 哎呀!也许我会添加 41,如果“TryGetValue”没有返回结果,他们会得到“未知”作为英文名称。 :)
  • 投票。谢谢。仍然决定绿色复选标记。你在奔跑!
【解决方案3】:

我编译了一个从各种来源收集的字符名称字典,用于我制作的用于搜索 unicode 字符的个人工具:http://jumpingfishes.com/unicodechars.htm

字典表示为一个 JavaScript 数组,包含 20,761 个定义。随意借用我的 JavaScript 来创建 C# 字典:
http://jumpingfishes.com/unicodeDescriptions.js

编辑:更好的是,这是我用来生成 JavaScript 的文本文件。这可能是一个更容易解析以生成 C# 字典的源。它包含十六进制字符代码,后跟一个制表符,后跟字符描述。
http://jumpingfishes.com/unicodeDictionary.txt

【讨论】:

  • 您的工具将受益于搜索字符的十进制或十六进制。
  • @jjs - 我同意。我可以发誓我有那个。
  • 仍然很棒。你看过 amp-what.com 吗?
【解决方案4】:

正如@rik-hemsley 对这个问题Finding out Unicode character name in .Net 的回答中提到的那样

现在比以往任何时候都容易,因为 nuget 中有一个名为 Unicode Information 的包

有了这个,你可以调用:

UnicodeInfo.GetName(character)

【讨论】:

  • 我希望这能行得通,但该库似乎只返回 NULL 用于控制字符(例如 CR 或 ETX)
猜你喜欢
  • 2018-03-18
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2021-03-31
  • 2021-04-25
相关资源
最近更新 更多