Member 11589429 Ответов: 3

Как узнать, что строка содержит символ unicode в C#?


Я столкнулся с ситуацией, когда я хочу проверить, содержит ли данная строка символ Юникода или нет?Как это сделать?

Что я уже пробовал:

строковый ввод = " не английский";

if (input.Любой(c => c > 255))
{
// Юникод
}

Правильно ли это?

Sinisa Hajnal

Это сработало бы...но я считаю, что это было бы быстрее с string.indexof вместо лямбда-выражения.

Member 11589429

Спасибо за ответ....

Sergey Alexandrovich Kryukov

Это неправильный вопрос. Символ не может быть Юникодом или не Юникодом. Это культурное образование. С точки зрения Юникода, все символы являются символами Юникода. Например, символы ASCII также являются символами Unicode.

Вы можете задать такой вопрос только в том случае, если назовете какой-то другой стандарт и захотите выяснить, как он связан с юникодом. Например, вы можете взять ASCII и задать вопрос: "Как узнать, содержит ли строка хотя бы один символ, который не поддерживается ASCII"? Вам не нужно упоминать слово "Unicode", потому что понятие .NET string подразумевает, что это всегда Unicode (внутреннее представление UTF-16LE, кстати).

Кстати, это не имеет никакого отношения к английскому. Знаете ли вы, что в английском языке на самом деле используются символы, отличные от ASCII? В современных условиях без поддержки юникода может быть написан только довольно неграмотный английский текст. :-)

Вы понимаете, в чем дело?

—СА

Member 11589429

Спасибо за ответ.

Sergey Alexandrovich Kryukov

См. также мое решение.
—СА

3 Ответов

Рейтинг:
2

Sinisa Hajnal

Вы также можете попробовать что-то вроде этого регулярного выражения:
[^\u0000-\u00ff]

Он говорит: найдите любой символ не между 0 и 255. Я не очень люблю регулярные выражения, но если вам когда-нибудь понадобится отфильтровать или добавить дополнительные символы, это будет проще, чем условные выражения в "нормальном" коде.

Удачи


Sergey Alexandrovich Kryukov

Извините, вы совершаете большую ошибку. См. решение 2.
—СА

Рейтинг:
1

Kornfeld Eliyahu Peter

В .NET (и для этого в C#) строка-это все!!! Юникод. Таким образом, в строке нет такого символа, отличного от Unicode, но есть такие символы из определенного диапазона Unicode...В вашем примере вы просите, чтобы символы имели кодовую точку больше 255, поэтому они не из базовой латыни и не из дополнения Latin-1...Но это не значит, что это не символы Юникода...
Если вы хотите проверить, есть ли символы из определенного диапазона (определенного языка?), посмотрите здесь диапазоны и проверьте соответственно:
Диапазоны Символов Юникода[^]


Sergey Alexandrovich Kryukov

Нет, от 128 до 255 не следует использовать. См. решение 2.
—СА

Kornfeld Eliyahu Peter

Я вас не понимаю. В моем чтении ОП спросил, Как определить, есть ли в строке символы из определенного (неанглийского) языка. OP назвал его-ошибочно-Unicode, но речь идет о диапазонах, поскольку строка отверстия-это Unicode...А диапазон 128-255-это вполне допустимый диапазон Юникода...

Sergey Alexandrovich Kryukov

Да, но вопрос связан с использованием этой строки в приложении, отличном от Unicode.
Вы действительно не понимаете: ниже 127 значение всех кодовых точек одно и то же, все стандартные разделяют этот диапазон. Не так в 128-255. Интерпретация каждого байта зависит от кодировки. Приходилось ли вам поддерживать какие-либо местные языки (не английский) до Unicode?
—СА

Kornfeld Eliyahu Peter

Я не вижу, где ОП говорит о не-Юникодном приложении...Однако в этом контексте я понимаю ваши опасения по поводу диапазона 128-255...

Sergey Alexandrovich Kryukov

Он не говорил об этом. Но смотрите мой комментарий к вопросу: формулировка неправильная, нелогичная. Но в чем заключается практическая забота? Потеря данных. Скажем, вы преобразуете текст в ASCII-представление, копируете его обратно в Unicode. Некоторые символы будут превращаться в"?", Потому что ASCII их не поддерживает. Но ASCII определяется до 127. Это все.

Но почему ASCII? Посмотрите на символы Юникода выше 127. Раньше они использовались для символов разных языков по-разному; не те же символы, что сейчас в Юникоде. Это зависело от" кодовой страницы", в терминах Microsoft. Следовательно, результат поездки туда и обратно зависит от "кодовой страницы". Другими словами, при преобразовании некоторого текста в Юникоде с использованием кодировки, отличной от Юникода, результат будет неопределенным.

Пожалуйста, смотрите мое обновление к моему ответу.

—СА

Рейтинг:
1

Sergey Alexandrovich Kryukov

Прежде всего, пожалуйста, посмотрите мой комментарий к этому вопросу.

Нет, использовать 255 неправильно. Вам нужно учитывать только ASCII, символы с кодовой точкой меньше или равной 127. Символы с кодовыми точками 128 и выше обычно имеют различное числовое представление в разных кодировках.

Я знаю, что могло сбить вас с толку, когда вы подумали о 255: так называемый "расширенный ASCII", популярная нестандартная кодировка, обычно используемая в приложениях MS DOS. Кроме того, существует несколько стандартных кодировок, основанных на том же принципе. В отличие от Юникода, символы, закодированные байтами со значениями выше 127, не имели однозначной интерпретации. В дополнение к байтам (тексту) нужно было бы добавить информацию о том, какая "кодовая страница" или кодировка используется. Некоторые из таких кодировок были стандартизированы, некоторые-нет. В некоторых культурах было кровавое месиво. Вы не можете полагаться ни на одну из этих ценностей.

Теперь вот бонус: вы хотите знать "символы Юникода": -) (символы, недоступные в ASCII), используемые в английском тексте? О, их очень много:— -...“"‘’, æ,©,†, ° и многое другое…

[РЕДАКТИРОВАТЬ]

Однако использование символьного числового значения для прямой проверки было бы плохим. Хороший код должен абстрагироваться от конкретного строкового представления. Одним из способов было бы следующее: использование класса System.Text.ASCIIEncoding, сериализовать строку в ASCII, а затем десериализовать его обратно в строку. После этой поездки туда и обратно у вас будет две строки: "до"и " после". Они оба являются "Юникодом", но в новой строке некоторые символы превратятся в два"?". Другими словами, если строки одинаковы, то все символы в исходной строке находятся в диапазоне ASCII. Вы можете сделать то же самое с любой другой кодировкой, отличной от Unicode.

—СА