Вопрос:

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

c# asp.net unicode

65335 просмотра

6 ответа

2224 Репутация автора

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

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

Спасибо!

Автор: Himberjack Источник Размещён: 16.12.2010 10:13

Ответы (6)


1 плюс

264760 Репутация автора

Все C#/ VB.NET stringтипы данных состоят из символов Unicode.

Автор: Mitch Wheat Размещён: 16.12.2010 10:15

1 плюс

93502 Репутация автора

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

От System.String:

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

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

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

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

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

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

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

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

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

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

Автор: Ani Размещён: 16.12.2010 10:16

62 плюса

34237 Репутация автора

Решение

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

Автор: Tim Lloyd Размещён: 16.12.2010 10:25

5 плюса

68150 Репутация автора

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)

Автор: Franci Penov Размещён: 16.12.2010 10:58

0 плюса

816 Репутация автора

Это еще одно решение без использования лямбда-выражений. Это в 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
Автор: Yiannis Mpourkelis Размещён: 26.10.2016 03:01

11 плюса

167 Репутация автора

Если строка содержит только символы ASCII, шаг сериализации + десериализации, использующий кодировку ASCII, должен вернуть ту же строку, чтобы проверка на один вкладыш в c # могла выглядеть так:

String s1="testभारत";
bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1)) != s1;
Автор: zingh Размещён: 22.08.2017 08:17
32x32