【问题标题】:How to recognize if a string contains unicode chars?如何识别字符串是否包含 unicode 字符?
【发布时间】:2011-05-26 11:10:20
【问题描述】:

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

我怎样才能做到这一点?

谢谢!

【问题讨论】:

  • 我认为您需要告诉我们更多信息,因为 .NET 中的所有字符串都是 unicode。您是否担心在编码过程中会丢失一些字符?如果是这样,请告诉我们您打算将这些知识用于什么目的。
  • 我想知道某些东西是否符合 ASCII...(完全符合)
  • 使用正则表达式 - 这将是一个相关问题 正则表达式可用于替换或匹配。以下答案是关于替换的,但您也可以使用正则表达式进行匹配stackoverflow.com/questions/7411438/…

标签: c# asp.net unicode


【解决方案1】:

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

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

【讨论】:

  • 它不适用于说俄语测试:System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes("фы")) != "фы" 返回 False。
  • 我在控制台应用程序中测试了您的确切陈述,它为我返回 True。
  • 我已经在 linqPad 中测试过了 - 它返回 false。
【解决方案2】:

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

【讨论】:

  • ASCII 中只有 128 个字符,因此 > 255 似乎不正确。
  • 有256个字符,包括基于此表的扩展ascii字符代码ascii-code.com
【解决方案3】:

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

【讨论】:

  • 这是不正确的。 C# char 是 unicode UTF-16 字符。只有最多 127 个字符与 ASCII 中的字符相同。 ASCII 扩展范围将根据所使用的语言环境而有所不同,即 ANSI 不是扩展 ASCII。因此,对于英语 ISO-8859-1,字符将匹配 UTF-16,但在其他语言环境中它们不会是相同的字符。请参阅此处的比较表:en.wikipedia.org/wiki/ISO/IEC_8859
【解决方案4】:

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

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

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

至于执行此操作的实际代码,@chibacity 答案应该可以工作,尽管您应该修改它以涵盖严格的 ASCII,因为它不适用于 ANSI。

[*] 也称为拉丁语 1 Windows (Win-1252)

【讨论】:

    【解决方案5】:

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

    来自System.String

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

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

    您通常不得不担心不同的 Unicode 编码:

    1. 编码一个字符串一个具有特定编码的字节流。
    2. 解码字符串来自具有特定编码的字节流。

    不过,一旦您进入字符串领域,字符串最初表示的编码(如果有的话)就无关紧要了。

    字符串中的每个字符都被定义 通过 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

    【讨论】:

    • Unicode 是 ASCII 的超集。问题显然是关于如何确定字符串是否仅使用 ASCII 字符。所以这个答案对我来说似乎是不必要的迂腐......
    • @Zero3:问题的编辑是在我回答之后进行的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2011-03-31
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    相关资源
    最近更新 更多