[英]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編碼:
一旦你進入字符串域,字符串最初表示的編碼(如果有的話)是無關緊要的。
字符串中的每個字符都由Unicode標量值定義,也稱為Unicode代碼點或Unicode字符的序數(數字)值。 每個代碼點使用UTF-16編碼進行編碼 , 編碼的每個元素的數值由Char對象表示。
也許您也可能會發現這些問題相關:
這篇文章由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.