簡體   English   中英

如何識別字符串是否包含unicode字符?

[英]How to recognize if a string contains unicode chars?

我有一個字符串,我想知道它內部是否有unicode字符。 (如果它完全包含ASCII或不包含ASCII)

我怎樣才能做到這一點?

謝謝!

如果我的假設是正確的,您希望知道您的字符串是否包含任何“非ANSI”字符。 您可以如下推導出這個。

    public void test()
    {
        const string WithUnicodeCharacter = "a hebrew character:\uFB2F";
        const string WithoutUnicodeCharacter = "an ANSI character:Æ";

        bool hasUnicode;

        //true
        hasUnicode = ContainsUnicodeCharacter(WithUnicodeCharacter);
        Console.WriteLine(hasUnicode);

        //false
        hasUnicode = ContainsUnicodeCharacter(WithoutUnicodeCharacter);
        Console.WriteLine(hasUnicode);
    }

    public bool ContainsUnicodeCharacter(string input)
    {
        const int MaxAnsiCode = 255;

        return input.Any(c => c > MaxAnsiCode);
    }

更新

這將檢測擴展的ASCII。 如果您只檢測真正的ASCII字符范圍(最多127個),那么您可能會獲得不表示Unicode的擴展ASCII字符的誤報。 我在我的樣本中提到了這一點。

如果一個字符串只包含ASCII字符,那么使用ASCII編碼的序列化+反序列化步驟應該返回相同的字符串,因此c#中的單行檢查可能看起來像..

String s1="testभारत";
bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1)) != s1;

ASCII僅定義0-127范圍內的字符代碼。 明確定義Unicode例如在ASCII的相同范圍內重疊。 因此,如果查看字符串中的字符代碼,並且它包含任何高於127的字符,則該字符串包含非ASCII字符的Unicode字符。

注意,ASCII僅包括英文字母。 因此,如果您(出於某種原因)需要將相同的方法應用於可能包含重音字符(例如西班牙語文本)的字符串,則ASCII不夠,您需要尋找另一個區分因素。

ANSI字符集[*]確實使用上述重音拉丁字符擴展ASCII字符,范圍為128-255 但是,Unicode在該范圍內不與ANSI重疊,因此從技術上講,Unicode字符串可能包含不屬於ANSI的字符,但具有相同的字符代碼(特別是在128-159范圍內,如表I所示)鏈接到)。

至於執行此操作的實際代碼,@ machib應答應該有效,盡管您應該修改它以涵蓋嚴格的ASCII,因為它不適用於ANSI。

[*]也稱為Latin 1 Windows(Win-1252)

所有C# / VB.NET string數據類型都包含Unicode字符。

只要它包含字符 ,它就包含Unicode字符。

來自System.String

將文本表示為一系列Unicode字符。

public static bool ContainsUnicodeChars(string text)
{
   return !string.IsNullOrEmpty(text);
}

您必須在以下情況下擔心不同的Unicode編碼:

  1. 編碼的字符串轉換成字節的與特定的編碼流。
  2. 使用特定編碼字節流中解碼字符串。

一旦你進入字符串域,字符串最初表示的編碼(如果有的話)是無關緊要的。

字符串中的每個字符都由Unicode標量值定義,也稱為Unicode代碼點或Unicode字符的序數(數字)值。 每個代碼點使用UTF-16編碼進行編碼編碼的每個元素的數值由Char對象表示。

也許您也可能會發現這些問題相關:

如何從字符串中刪除非ASCII字符? (在C#中)

C#確保字符串僅包含ASCII

這篇文章由Jon Skeet撰寫: Unicode和.NET

這是另一種不使用lambda表達式的解決方案。 它在VB.NET中,但您可以輕松地將其轉換為C#:

   Public Function ContainsUnicode(ByVal inputstr As String) As Boolean
        Dim inputCharArray() As Char = inputstr.ToCharArray

        For i As Integer = 0 To inputCharArray.Length - 1
            If CInt(AscW(inputCharArray(i))) > 255 Then Return True
        Next
        Return False
   End Function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM