2012-01-19 43 views
7

Tôi vừa sử dụng liên kết hữu ích nhất này: How do I check if a given string is a legal/valid file name under Windows?Làm thế nào để có được một "tên tiếng Anh" cho một nhân vật?

Và bên trong một số mã xác thực tôi có một cái gì đó giống như (bỏ qua thực tế là tôi không sử dụng lớp StringBuilder và bỏ qua lỗi khi tạo thư) 't cần phải nói với họ về 'Colon' nhiều hơn một lần nếu nó xuất hiện trong chuỗi nhiều hơn một lần)):

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 sẽ giống như thế (sử dụng ví dụ rằng một dấu hai chấm được tìm thấy):

- bắt đầu -

.210

Các nhân vật không hợp lệ sau đây được phát hiện:

:

- end -

Tôi muốn nó nói cái gì đó như:

- bắt đầu -

Các ký tự không hợp lệ sau được phát hiện:

Colon ->:

- kết thúc -

Tôi thích có tên tiếng Anh. Không phải là một kẻ giết người, nhưng đã tò mò nếu có một số chức năng ra khỏi đó như (mà không tồn tại cho lớp Char, nhưng có thể tồn tại trong một số lớp khác mà tôi không nghĩ đến):

Char.GetEnglishName (': ');

+2

bạn đã cố viết chức năng của riêng mình chưa? –

+1

@ DanielA.White Tôi không chắc chắn nếu anh ta muốn Unicode, nhưng đó là rất nhiều nhân vật. Chương trình Charmap có dữ liệu đó. – McKay

+2

:) Char.GetEnglishName (':'); Tôi ước rằng sẽ có một phương pháp như thế này –

Trả lời

6

Bạn chỉ có thể sử dụng basic latin and controls unicode block nếu bạn không cần phải giải thích cho tất cả các nhân vật, bao giờ hết .

Bạn có thể định nghĩa bảng như một mảng chuỗi đơn giản để làm cho tra cứu nhanh:

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"; 

Sau đó, tất cả các bạn cần làm là:

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

Hoặc:

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

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

Tuyệt vời. Cho đến nay nó sẽ đến với bạn và làm dấu cho dấu kiểm màu xanh lá cây. Tôi vừa mới bỏ phiếu. – JustLooking

+0

Mặc dù plinth được trả lời đầu tiên, bạn đã đi thêm dặm (cắt dán!). Dấu kiểm màu xanh lục cho bạn! – JustLooking

4

Vấn đề mà bạn sẽ gặp phải là bạn cần có khả năng đại diện cho không gian Unicode, sẽ rất lớn. Nếu bạn thực sự muốn làm điều này, thả các nội dung của this page thành một điển sau đó sử dụng phương pháp tiện ích này trên 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(); 
+3

Không có lý do gì để khởi tạo kết quả. TryGetValue sẽ đặt nó thành null nếu nó không tìm thấy khóa. – Fantius

+0

Eeek! Có lẽ tôi sẽ chỉ thêm 41 và nếu "TryGetValue" không trả lại kết quả, họ sẽ nhận được "Không xác định" là tên tiếng Anh. :) – JustLooking

+0

Up-Vote. Cảm ơn. Vẫn quyết định dấu kiểm màu xanh lá cây. Bạn đang chạy! – JustLooking

1

Tôi đã biên soạn một từ điển tên nhân vật mà tôi thu thập từ nhiều nguồn khác nhau cho một công cụ cá nhân mà tôi đã thực hiện để tìm kiếm thông qua unicode ký tự: http://jumpingfishes.com/unicodechars.htm

Từ điển được biểu thị dưới dạng mảng JavaScript và chứa 20.761 định nghĩa. Cảm thấy tự do để mượn JavaScript của tôi để tạo ra một từ điển C#:
http://jumpingfishes.com/unicodeDescriptions.js

Edit: Hơn thế nữa, đây là tập tin văn bản tôi sử dụng để tạo JavaScript của tôi.Điều này có thể là một nguồn dễ dàng hơn để phân tích cú pháp để tạo một từ điển C#. Nó chứa mã ký tự trong hex, sau đó là một tab theo sau là mô tả ký tự.
http://jumpingfishes.com/unicodeDictionary.txt

+0

Bỏ phiếu. Cảm ơn cho đầu vào, nó thực sự đánh giá cao. – JustLooking

+0

công cụ của bạn sẽ được hưởng lợi từ việc tìm kiếm thập phân hoặc thập lục phân của ký tự. – JJS

+0

@jjs - Tôi đồng ý. Tôi có thể thề rằng tôi đã có nó ở đó. – gilly3

1

như đã đề cập trong câu trả lời cho câu hỏi này Finding out Unicode character name in .Net bởi @ rik-hemsley

Nó dễ dàng hơn bao giờ hết bây giờ, khi có một gói trong NuGet tên Unicode Information

Với điều này, bạn chỉ có thể gọi :

UnicodeInfo.GetName(character) 
+1

Tôi đã hy vọng điều này sẽ làm việc, nhưng các thư viện dường như không bao giờ trở lại bất cứ điều gì nhưng NULL cho các ký tự điều khiển (ví dụ như CR, hoặc ETX) –

Các vấn đề liên quan