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

时间:2010-12-16 10:13:06

标签: c# asp.net unicode

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

我怎样才能做到这一点?

谢谢!

6 个答案:

答案 0 :(得分:57)

如果我的假设是正确的,您希望知道您的字符串是否包含任何“非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字符的误报。我在我的样本中提到了这一点。

答案 1 :(得分:11)

如果字符串仅包含ASCII字符,则使用ASCII编码的序列化+反序列化步骤应该返回相同的字符串 所以c#中的单行检查可能看起来像..

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

答案 2 :(得分:5)

ASCII仅定义0-127范围内的字符代码。明确定义Unicode,例如在ASCII的相同范围内重叠。因此,如果查看字符串中的字符代码,并且它包含任何高于127的字符,则该字符串包含非ASCII字符的Unicode字符。

请注意,ASCII仅包含英文字母。因此,如果您(出于任何原因)需要将相同的方法应用于可能包含重音字符的字符串(例如西班牙语文本),则ASCII不够,您需要寻找另一个区别。

ANSI字符集[*]确实使用128-255范围内的上述重音拉丁字符扩展了ASCII字符。但是,Unicode在该范围内不与ANSI重叠,因此从技术上讲,Unicode字符串可能包含不属于ANSI的字符,但具有相同的字符代码(特别是在128-159范围内,如您所见我链接到的表格。

至于执行此操作的实际代码,@ machib应答应该有效,尽管你应该修改它以涵盖严格的ASCII,因为它不适用于ANSI。

[*]也称为Latin 1 Windows(Win-1252)

答案 3 :(得分:1)

所有C# / VB.NET string数据类型都包含Unicode字符。

答案 4 :(得分:1)

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

来自System.String

  

将文本表示为一系列Unicode   字符。

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

您必须在以下情况下担心不同的Unicode编码:

  1. 将字符串编码具有特定编码的字节流中。
  2. 使用特定编码从字节流解码字符串
  3. 一旦你进入字符串域,字符串最初用字符串表示的编码(如果有的话)是无关紧要的。

      

    定义字符串中的每个字符   通过Unicode标量值,也称为   Unicode代码点或序号   Unicode的(数字)值   字符。 每个代码点都经过编码   通过使用UTF-16编码,和   每个元素的数值   编码由Char表示   对象

    也许您可能也会发现这些问题相关:

    How can you strip non-ASCII characters from a string? (in C#)

    C# Ensure string contains only ASCII

    Jon Skeet的这篇文章:Unicode and .NET

答案 5 :(得分:0)

这是另一种不使用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