2010-12-16 3 views
22

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

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

Спасибо!

+2

Я думаю, вам нужно рассказать нам больше, поскольку все строки в .NET являются unicode. Вы боитесь, что потеряете некоторые символы в процессе кодирования? Если да, сообщите нам, на что вы намерены использовать эти знания. – 2010-12-16 10:16:44

ответ

54

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

5

Все C#/VB.NETstring datatypes состоят из символов Юникода.

2

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

От System.String:

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

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

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

  1. Encode в виде строки в поток байт с определенной кодировкой.
  2. Декодирование строка от поток байтов с определенным кодированием.

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

Каждый символ в строке определяется значением скалярного 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

5

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)

0

Это еще одно решение без использования лямбда как выражения. Это в 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 
1

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

String s1="testभारत"; 
bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1))==s1; 
Смежные вопросы