如何识别字符串是否包含unicode字符?

我有一个字符串,我想知道它内部是否有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仅包含英文字母。 因此,如果您(出于任何原因)需要将相同的方法应用于可能包含重音字符的字符串(例如西class牙语文本),则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