Каковы все японские символы пробелов?
Мне нужно разбить строку и извлечь слова, разделенные пробельными символами. Источник может быть на английском или японском. Английские символы пробелов включают в себя вкладку и пробел, а японский текст также использует их. (IIRC, все широко используемые японские наборы символов являются надмножествами US-ASCII.)
Итак, набор символов, которые мне нужно использовать для разделения моей строки, включает в себя обычное пространство ASCII и вкладку.
Но на японском языке есть еще один космический персонаж, обычно называемый "пространством полной ширины". Согласно моей утилите Mac Character Viewer, это U + 3000 "IDEOGRAPHIC SPACE". Это (обычно), что получается, когда пользователь нажимает клавишу пробела при вводе в японский режим ввода.
Есть ли другие символы, которые мне нужно рассмотреть?
Я обрабатываю текстовые данные, представленные пользователями, которым было сказано "разделить записи с пробелами". Тем не менее, пользователи используют самые разные компьютерные и мобильные операционные системы для отправки этих текстов. Мы уже видели, что пользователи могут не знать, находятся ли они в японском или английском режиме ввода при вводе этих данных.
Кроме того, поведение ключа пространства различается по платформам и приложениям даже в японском режиме (например, Windows 7 будет вставлять идеографическое пространство, но iOS будет вставлять пространство ASCII).
Так что я хочу, в основном, "набор всех символов, которые визуально выглядят как пространство и могут быть сгенерированы, когда пользователь нажимает клавишу пробела или клавишу табуляции, поскольку многие пользователи не знают разницы между пространством и вкладка на японском и/или английском языках".
Есть ли какой-либо авторитетный ответ на такой вопрос?
Ответы
Ответ 1
Вам нужна вкладка ASCII, пробел и неразрывное пространство (U + 00A0) и пространство полной ширины, которое вы правильно идентифицировали как U + 3000. Возможно, вам понадобятся символы новой строки и вертикального пробела. Если ваш вход находится в юникоде (не Shift-JIS и т.д.), Тогда все, что вам нужно. Существуют и другие (контрольные) символы, такие как \0 NULL, которые иногда используются как разделители информации, но они не будут отображаться как пространство в восточноазиатском тексте, т.е. Они не будут отображаться как пробелы.
edit: Matt Ball имеет хороший момент в своем комментарии, но, как показывает его пример, многие реализации регулярных выражений не справляются с полной шириной восточноазиатской пунктуации. В связи с этим стоит упомянуть, что Python string.whitespace
также не будет вырезать горчицу.
Ответ 2
Я только что нашел ваше сообщение. Это отличное объяснение нормализации символов Unicode.
http://en.wikipedia.org/wiki/Unicode_equivalence
Я обнаружил, что многие языки программирования, такие как Python, имеют модули, которые могут реализовать эти правила нормализации в стандартах Unicode. Для моих целей я нашел, что следующий код python работает очень хорошо. Он преобразует все unicode-варианты пробелов в диапазон ascii. После нормализации команда regex может преобразовать все пробелы в ascii\x32:
import unicodedata
# import re
ucode = u'大変、 よろしくお願い申し上げます。'
normalized = unicodedata.normalize('NFKC', ucode)
# old code
# utf8text = re.sub('\s+', ' ', normalized).encode('utf-8')
# new code
utf8text = ' '.join(normalized.encode('utf-8').split())
С момента первого написания я узнал, что модуль regex (re) Python ненадлежащим образом идентифицирует эти пробельные символы и может вызвать сбой, если он встречается. Получается более быстрый и надежный метод использования функции .split().