Каковы все японские символы пробелов?

Мне нужно разбить строку и извлечь слова, разделенные пробельными символами. Источник может быть на английском или японском. Английские символы пробелов включают в себя вкладку и пробел, а японский текст также использует их. (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().