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

Him*_*ack 34 c# asp.net unicode

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

我怎样才能做到这一点?

谢谢!

Tim*_*oyd 63

如果我的假设是正确的,您希望知道您的字符串是否包含任何"非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);
    }
Run Code Online (Sandbox Code Playgroud)

更新

这将检测扩展的ASCII.如果您只检测真正的ASCII字符范围(最多127个),那么您可能会获得不表示Unicode的扩展ASCII字符的误报.我在我的样本中提到了这一点.

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

zin*_*ngh 11

如果一个字符串只包含ASCII字符,那么使用ASCII编码的序列化+反序列化步骤应该返回相同的字符串,因此c#中的单行检查可能看起来像..

String s1="test????";
bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1)) != s1;
Run Code Online (Sandbox Code Playgroud)


Fra*_*nov 5

ASCII仅定义范围中的字符代码0-127.Unicode明确定义,例如在ASCII的相同范围内重叠.因此,如果你看一下在你的字符串中的字符代码,它包含任何东西比127更高,该字符串包含非ASCII字符的Unicode字符.

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

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

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

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