У меня есть строка, и я хочу знать, содержит ли она символы Unicode внутри или нет. (если он полностью содержит ASCII или нет)
Как я могу это достичь?
Спасибо!
У меня есть строка, и я хочу знать, содержит ли она символы Unicode внутри или нет. (если он полностью содержит ASCII или нет)
Как я могу это достичь?
Спасибо!
Если мои предположения верны, вы хотите знать, содержит ли ваша строка любые символы "не 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. Я упомянул об этом в своем примере.
Все C#
/VB.NET
string
datatypes состоят из символов Unicode.
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)
Пока он содержит символы, он содержит символы Unicode.
Из System.String
:
Представляет текст как серию Unicode символы.
public static bool ContainsUnicodeChars(string text)
{
return !string.IsNullOrEmpty(text);
}
Обычно вам приходится беспокоиться о разных кодировках Unicode, когда вам нужно:
Как только вы попадаете в строку, хотя кодировка, из которой первоначально была представлена строка, если таковая имеется, не имеет значения.
Каждый символ в строке определен по сканируемому значению Unicode, также называемому кодовая точка Юникода или порядковый номер (числовое) значение Unicode персонаж. Каждая кодовая точка кодируется используя кодировку UTF-16, а числовое значение каждого элемента кодирование представлено Charобъект.
Возможно, вы также найдете следующие вопросы:
Как вы можете вырезать не-ASCII-символы из строки? (в С#)
С# Убедитесь, что строка содержит только ASCII
И эта статья Джона Скита: Unicode и .NET
Если строка содержит только символы ASCII, шаг сериализации + десериализации с использованием кодировки ASCII должен возвращать ту же строку поэтому проверка на один лайнер в С# может выглядеть так.
String s1="testभारत";
bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1))==s1;
Это другое решение без использования лямбда-экспресии. Это в 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