Каков диапазон печатных символов Юникода?
Кто-нибудь может сказать, пожалуйста, каков диапазон печатных символов Юникода? [например, печатаемый диапазон символов Ascii \u0020 - \u007f]
9 ответов
См. http://en.wikipedia.org/wiki/Unicode_control_characters
Возможно, вы захотите обратить особое внимание на управляющий символ C0 и C1 http://en.wikipedia.org/wiki/C0_and_C1_control_codes
В вики говорится, что управляющий символ C0 находится в диапазоне U+0000—U+001F и U+007F (что совпадает с диапазоном ASCII), а управляющий символ C1 - в диапазоне U+0080—U+009F
кроме символа C-control, Unicode также имеет сотни управляющих символов форматирования, например, не объединяющий нулевой ширины, что делает интервал между символами ближе, или двунаправленный текстовый элемент управления. При этом символы управления форматированием довольно разбросаны.
Что еще более важно, что вы делаете, что требует, чтобы вы знали непечатаемые символы Unicode? Скорее всего, что вы пытаетесь сделать, это неправильный подход к решению вашей проблемы.
Это старый вопрос, но он все еще действителен, и я думаю, что есть что-то полезное, но вкратце, сказать по этому вопросу, чем это отражено в существующих ответах.
Unicode
Юникод определяет свойства для символов.
Одним из этих свойств является "Общая категория", которая имеет Основные классы и подклассы. Основными классами являются буква, знак, пунктуация, символ, разделитель и другие.
Зная свойства ваших персонажей, вы можете решить, считаете ли вы их печатными в вашем конкретном контексте.
Вы всегда должны помнить, что такие термины, как "характер" и "печатный", часто сложны и имеют интересные граничные случаи.
Поддержка языка программирования
Некоторые языки программирования помогают с этой проблемой.
Например, язык Go имеет пакет "Юникод", который предоставляет множество полезных функций, связанных с Юникодом, включая следующие:
func IsGraphic(r rune) bool
IsGraphic reports whether the rune is defined as a Graphic by Unicode. Such
characters include letters, marks, numbers, punctuation, symbols, and spaces,
from categories L, M, N, P, S, Zs.
func IsPrint(r rune) bool
IsPrint reports whether the rune is defined as printable by Go. Such
characters include letters, marks, numbers, punctuation, symbols, and
the ASCII space character, from categories L, M, N, P, S and the ASCII
space character. This categorization is the same as IsGraphic except
that the only spacing character is ASCII space, U+0020.
Обратите внимание, что в нем указано "определено как печатаемое с помощью Go", а не как "определено как печатаемое с помощью Unicode". Это похоже на то, что волшебники в Юникоде не осмеливаются оставаться в глубине.
Версия для печати
Чем больше вы узнаете о Юникоде, тем больше вы понимаете, насколько неожиданно разнообразны и непостижимо странные человеческие системы письма.
В частности, может ли печататься определенный "символ", не всегда очевидно.
Можно ли печатать пространство нулевой ширины? Когда печатается точка переноса? Существуют ли символы, пригодность для печати которых зависит от их положения в слове или от того, какие символы соседствуют с ними? Всегда ли печатается комбинирующий символ?
Сноски
ASCII-диапазон печатных символов - \u0020 - \u007f
Нет, это не так. \u007f - это DEL, который обычно не считается печатным символом. Это, например, связано с клавишей клавиатуры, помеченной как "DEL", чья самая ранняя цель состояла в том, чтобы дать команду на удаление символа с некоторого носителя (отображение, файл и т. Д.).
На самом деле, многие 8-битные наборы символов имеют много непоследовательных диапазонов, которые нельзя распечатать. Смотрите, например, C0 и C1 управления.
Во-первых, вы должны удалить слово "UTF8" в вашем вопросе, это не имеет отношения к делу (UTF8 - это просто одна из кодировок Unicode, это что-то ортогональное вашему вопросу).
Второе: значение "печатный / не печатаемый" менее понятно в Юникоде. Возможно, вы имеете в виду " графический персонаж"; и можно даже оспорить, если пробел является печатным / графическим. Неграфические символы будут состоять, в основном, из управляющих символов: диапазон 0x00-0x0f плюс некоторые другие, которые разбросаны.
В любом случае, подавляющее большинство символов Unicode (более 200 000) являются "графическими". Но это, конечно, не означает, что они пригодны для печати в вашей среде.
Мне кажется плохой идеей, если вы намерены генерировать "произвольную печатную" строку юникода, пытаться включить все "печатные" символы.
Что вы должны сделать, это выбрать шрифт, а затем сгенерировать список символов Unicode, которые имеют глифы, определенные для вашего шрифта. Вы можете использовать библиотеку шрифтов, например, freetype, для проверки глифов (проверьте FT_Get_Char_Index(...)!= 0).
Какие символы допустимы?
В настоящее время Unicode определяется как начинающийся и заканчивающийся на
U+10FFFF
. Первый блок, Basic Latin, охватывает, а последний блок, Additional Private Use Area-B , охватывает
U+100000
к
10FFFF
. Если вы хотите увидеть все эти блоки, см. Здесь: .
Давайте разберемся, что действительно / недействительно в латинском блоке1.
Латинский блок: TLDR
Если вы хотите отфильтровать невидимые символы, отфильтруйте:
- контролировать
- кому: Устройство (т. е. Control)
- : Удалить (Контроль)
- кому: Устройство (т. е. Control)
Латинский блок: полный диапазон
Вот латинский блок, разбитый на более мелкие части ...
- к
U+0008
: Контроль -
U+0009
кU+000C
: Космос -
U+000E
кU+001F
: Устройство (т. Е. Control) -
U+0020
: Космос -
U+0021
кU+002F
: Символы -
U+0030
кU+0039
: Числа -
U+003A
кU+0040
: Символы -
U+0041
кU+005A
: Заглавные буквы -
U+005B
кU+0060
: Символы -
U+0061
кU+007A
: Строчные буквы -
U+007B
кU+007E
: Символы - : Удалить (Контроль)
- к
U+008C
: Latin1-Дополнительные символы. -
U+008D
кU+009F
: Устройство (т. Е. Control) -
U+00A0
: Неразрывное пространство. (т.е.
) -
U+00A1
кU+00BF
: Символы. -
U+00C0
кому: Знаки с надстрочными знаками.
Другие блоки
Unicode известен тем, что поддерживает нелатинские наборы символов, так что же это за другие блоки? Это всего лишь общий обзор , полный список см. На Wikipedia.org: Unicode Block; Список блоковстранице wikipedia.org .
Блоки, связанные с Latin1 и Latin1
-
U+0000
кU+007F
: Базовая латынь -
U+0080
кU+00FF
: Дополнение Latin-1 -
U+0100
кU+017F
: Расширенная латиница-A -
U+0180
кU+024F
: Расширенная латиница-B
Комбинируемые блоки
U+0250
к
U+036F
: 3 блока.
Нелатинский язык, языковые блоки
U+0370
к
U+1C7F
: 55 блоков.
Блоки языковых дополнений, отличные от латыни
U+1C80
к
U+209F
: 11 блоков.
Блоки символов
U+20A0
к
U+2BFF
: 22 блока.
Блоки древнего языка
U+2C00
к
U+2C5F
: 1 Блок (Глаголица).
Блоки языковых расширений
U+2C60
к
U+FFEF
: 66 блоков.
Специальные блоки
U+FFF0
к
U+FFFF
: 1 Блок (Особые).
Используя противоположный подход к @HoldOffHunger, может быть проще перечислить диапазоны непечатаемых символов и использовать
not
чтобы проверить, пригоден ли символ для печати.
В стиле Regex (поэтому, если вам нужны печатные символы , поместите
^
):
[\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]
Что учитывает такие вещи, как пробелы разделителя и объединители
Обратите внимание, что в отличие от их ответа, который представляет собой белый список, который игнорирует все нелатинские языки, этот черный список не разрешает непечатаемые символы только потому, что они находятся в блоках с печатными символами (их ответ полностью включает
Non-Latin, Language Supplement blocks
как 'printable', даже если он содержит такие вещи, как 'non-joiner нулевой ширины'..).
Однако имейте в виду, что при использовании этого или любого другого решения, например, для санитарии, вы можете сделать что-то более тонкое, чем замена одеяла.
Возможно, в этом случае
non-breaking space
s должен измениться на
space
, не удаляться, и
invisible separator
следует заменить запятой условно .
Кроме того, существуют недопустимые диапазоны символов, [еще] неиспользуемые или зарезервированные для целей кодирования, а также селекторы вариантов для конкретного языка .
NB я действительно включил \u{E0100}-\u{E01EF}
раньше, но то, что я пробовал, движки с регулярными выражениями не справлялись, поэтому я не знаю, что вы использовали бы, чтобы справиться с этим.
Один из подходов - визуализировать каждый символ в текстуре и вручную проверять, виден ли он. Это решение исключает пробелы.
Я написал такую программу и использовал ее, чтобы определить, есть примерно 467241 печатный символ в первых 471859 кодовых точках. Я выбрал это число, потому что оно охватывает все первые 4 уровня Unicode, которые, кажется, содержат все печатные символы. См. Https://en.wikipedia.org/wiki/Plane_(Unicode)
Я бы очень хотел доработать свою программу, чтобы составить список диапазонов , но сейчас вот то, с чем я работаю для тех, кому нужны немедленные ответы:
https://editor.p5js.org/SamyBencherif/sketches/_OE8Y3kS9
Я публикую этот инструмент, потому что думаю, что этот вопрос привлекает множество людей, которые ищут немного другие приложения для знания диапазонов для печати. Надеюсь, это будет полезно, хотя и не полностью отвечает на вопрос.
Диапазон печатаемых символов Unicode, исключая шестнадцатеричный, составляет от 32 до 126 в типе данных int.
Юникод, термин stict, не имеет диапазона. Числа могут идти бесконечно.
То, что вы дали, не UTF8, который имеет 1 байт для символов ASCII.
Что касается диапазона, я считаю, что нет диапазона печатных символов. Это всегда развивается. Проверьте страницу, которую я дал выше.