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

C# 如何识别字符串是否包含unicode字符?,c#,asp.net,unicode,C#,Asp.net,Unicode,我有一个字符串,我想知道里面是否有unicode字符。 (如果其完全包含ASCII或不包含ASCII) 我怎样才能做到这一点 谢谢 只要它包含字符,它就包含Unicode字符 发件人: 将文本表示为一系列Unicode字符 人物 当您必须执行以下操作时,通常需要考虑不同的Unicode编码: 使用特定编码将字符串编码为字节流 从具有特定编码的字节流中解码字符串 但一旦进入字符串区域,字符串最初使用的编码(如果有的话)就无关紧要了 字符串中的每个字符都已定义 通过Unicode标量值,也称为 Un

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

我怎样才能做到这一点

谢谢

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

发件人:

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

当您必须执行以下操作时,通常需要考虑不同的Unicode编码:

  • 使用特定编码将字符串编码为字节流
  • 从具有特定编码的字节流中解码字符串
  • 但一旦进入字符串区域,字符串最初使用的编码(如果有的话)就无关紧要了

    字符串中的每个字符都已定义 通过Unicode标量值,也称为 Unicode代码点或序数 (数字)Unicode的值 性格对每个代码点进行编码 通过使用UTF-16编码,以及 表中每个元素的数值 编码由字符表示 反对

    也许你也会发现这些问题是相关的:


    Jon Skeet的这篇文章:

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

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

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

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

    至于实现这一点的实际代码,@chibacity answer应该可以工作,尽管您应该修改它以覆盖严格的ASCII,因为它不适用于ANSI


    [*]也称为拉丁1窗口(Win-1252)

    这是另一个不使用lambda表达式的解决方案。它在VB.NET中,但您可以轻松地将其转换为C#:


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

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

    我认为您需要告诉我们更多,因为.NET中的所有字符串都是unicode。您是否担心在编码过程中会丢失一些字符?如果是这样,请告诉我们你打算用这些知识做什么。我想知道一些东西是否符合ASCII。。。(完全遵守)使用正则表达式-这将是一个相关问题,正则表达式可用于替换或匹配。下面的答案是关于替换的,但是您可以使用正则表达式来匹配,因为Unicode是ASCII的超集。问题显然是如何确定字符串是否只使用ASCII字符。所以这个答案对我来说似乎不必要的迂腐…@Zero3:对这个问题的编辑是在我的答案之后进行的。ASCII中只有128个字符,因此,
    >255
    似乎不正确。有256个字符,包括基于此表的扩展ascii字符代码。它不适用于俄语测试:
    System.Text.asciencoding.GetEncoding(0).GetString(System.Text.asciencoding.GetEncoding(0).GetBytes(“фƏ”)!=“фы”
    返回False。我在控制台应用程序中测试了您的精确语句,它为我返回True。我在linqPad中测试了这一点-它返回False。这是不正确的。C字符是unicode UTF-16字符。只有127个字符与ASCII中的字符相同。ASCII扩展范围将根据所使用的语言环境而有所不同,即ANSI非扩展ASCII。因此,对于英语ISO-8859-1,字符将与UTF-16匹配,但在其他语言环境中它们将不相同。请参见此处的比较表:。
       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
    
    String s1="testभारत";
    bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1)) != s1;