У меня есть строка, и я хочу знать, есть ли она внутри символов Unicode внутри или нет. (если он полностью содержит ASCII или нет)Как узнать, содержит ли строка символы Unicode?
Как я могу это достичь?
Спасибо!
У меня есть строка, и я хочу знать, есть ли она внутри символов Unicode внутри или нет. (если он полностью содержит ASCII или нет)Как узнать, содержит ли строка символы Unicode?
Как я могу это достичь?
Спасибо!
Если мои предположения верны вы хотите знать, содержит ли ваша строка любые символы «не 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);
}
Update
Это определит для расширенного ASCII. Если вы обнаружите только истинный диапазон символов ASCII (до 127), вы можете получить ложные срабатывания для расширенных символов ASCII, которые не обозначают Unicode. Я упомянул об этом в своем примере.
Все C#
/VB.NET
string
datatypes состоят из символов Юникода.
Пока содержит символов, он содержит символы Юникода.
От System.String
:
Представляет текст как последовательность Unicode символов.
public static bool ContainsUnicodeChars(string text)
{
return !string.IsNullOrEmpty(text);
}
Вы обычно должны беспокоиться о различных кодировках 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 тарелочкам: Unicode and .NET
ASCII
определяет только коды символов в диапазоне 0-127
. Unicode
явно определен как перекрытие в том же диапазоне с ASCII. Таким образом, если вы посмотрите на коды символов в своей строке и содержит все, что выше 127, строка содержит символы Unicode, которые не являются символами ASCII.
Обратите внимание, что ASCII включает только английский алфавит. Таким образом, если вы (по какой-либо причине) должны применять тот же подход к строкам, который может содержать акцентированные символы (например, в испанском тексте), ASCII недостаточно, и вам нужно искать другой дифференциатор.
набор символов [*] расширяет символы ASCII с указанными выше латинскими буквами в диапазоне 128-255
. Однако Unicode не перекрывается с ANSI в этом диапазоне, поэтому технически строка Unicode может содержать символы, которые не являются частью ANSI, но имеют одинаковый код символа (в частности, в диапазоне 128-159
, как вы можете видеть из таблицы, с которой я связан с).
Что касается фактического кода для этого, то ответ @chibacity должен работать, хотя вы должны изменить его, чтобы покрыть строгий ASCII, потому что он не будет работать для ANSI.
[*] Также известен как Latin 1. Windows (Win-1252)
Это еще одно решение без использования лямбда как выражения. Это в 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, сериализации + шаг десериализации с использованием кодировки ASCII должны получить обратно ту же строку так чек один лайнер в C# может выглядеть так.
String s1="testभारत";
bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1))==s1;
Я думаю, вам нужно рассказать нам больше, поскольку все строки в .NET являются unicode. Вы боитесь, что потеряете некоторые символы в процессе кодирования? Если да, сообщите нам, на что вы намерены использовать эти знания. – 2010-12-16 10:16:44