Как распознать, содержит ли строка символы unicode?

У меня есть строка, и я хочу знать, содержит ли она символы Unicode внутри или нет. (если он полностью содержит ASCII или нет)

Как я могу это достичь?

Спасибо!

Ответ 1

Если мои предположения верны, вы хотите знать, содержит ли ваша строка любые символы "не 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), вы можете получить ложные срабатывания для расширенных символов ASCII, которые не обозначают Unicode. Я упомянул об этом в своем примере.

Ответ 2

Все C#/VB.NET string datatypes состоят из символов Unicode.

Ответ 3

ASCII определяет только коды символов в диапазоне 0-127. Unicode явно определен как перекрытие в том же диапазоне с ASCII. Таким образом, если вы посмотрите на коды символов в своей строке и содержит все, что выше 127, строка содержит символы Unicode, которые не являются символами ASCII.

Обратите внимание, что ASCII включает только английский алфавит. Таким образом, если вам (по какой-либо причине) необходимо применить тот же подход к строкам, который может содержать акцентированные символы (например, в испанском тексте), ASCII недостаточно, и вам нужно искать другой дифференциатор.

ANSI набор символов [*] расширяет символы ASCII с вышеупомянутыми латинскими буквами в диапазоне 128-255. Однако Unicode не перекрывается с ANSI в этом диапазоне, поэтому технически строка Unicode может содержать символы, которые не являются частью ANSI, но имеют одинаковый код символа (в частности, в диапазоне 128-159, как вы можете видеть из таблицы я связанный с).

Что касается фактического кода для этого, то ответ на @chibacity должен работать, хотя вы должны его изменить, чтобы покрыть строгий ASCII, потому что он не будет работать для ANSI.

[*] Также известен как Latin 1 Windows (Win-1252)

Ответ 4

Пока он содержит символы, он содержит символы Unicode.

Из System.String:

Представляет текст как серию Unicode символы.

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

Обычно вам приходится беспокоиться о разных кодировках Unicode, когда вам нужно:

  • Кодировать строку в поток байтов с определенной кодировкой.
  • Декодировать строку из потока байтов с определенной кодировкой.

Как только вы попадаете в строку, хотя кодировка, из которой первоначально была представлена ​​строка, если таковая имеется, не имеет значения.

Каждый символ в строке определен по сканируемому значению Unicode, также называемому кодовая точка Юникода или порядковый номер (числовое) значение Unicode персонаж. Каждая кодовая точка кодируется используя кодировку UTF-16, а числовое значение каждого элемента кодирование представлено Charобъект.

Возможно, вы также найдете следующие вопросы:

Как вы можете вырезать не-ASCII-символы из строки? (в С#)

С# Убедитесь, что строка содержит только ASCII

И эта статья Джона Скита: Unicode и .NET

Ответ 5

Если строка содержит только символы ASCII, шаг сериализации + десериализации с использованием кодировки ASCII должен возвращать ту же строку поэтому проверка на один лайнер в С# может выглядеть так.

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

Ответ 6

Это другое решение без использования лямбда-экспресии. Это в VB.NET, но вы можете легко преобразовать его в С#:

   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