Каковы все японские пробельные символы? - PullRequest
10 голосов
/ 29 ноября 2010

Мне нужно разбить строку и извлечь слова, разделенные пробелами. Источник может быть на английском или японском языке.Английские пробельные символы включают символы табуляции и пробела, и японский текст тоже использует их.(IIRC, все широко используемые японские наборы символов являются надмножествами US-ASCII.)

Таким образом, набор символов, которые мне нужно использовать для разделения строки, включает в себя обычный пробел ASCII и символ табуляции.

Но в японском языке есть еще один символ пробела, обычно называемый «пробел во всю ширину».В соответствии с утилитой Character Viewer моего Mac, это U + 3000 "IDEOGRAPHIC SPACE".Это (обычно) то, что получается, когда пользователь нажимает пробел при наборе текста в японском режиме ввода.

Есть ли другие символы, которые мне нужно рассмотреть?

Я обрабатываю текстовые данные, предоставленные пользователями, которым было сказано "разделять записи пробелами".Тем не менее, пользователи используют широкий спектр компьютерных и мобильных операционных систем для отправки этих текстов.Мы уже видели, что пользователи могут не знать, находятся ли они в режиме ввода на японском или английском языке при вводе этих данных.

Кроме того, поведение клавиши пробела различается на разных платформах и в приложениях даже в японском режиме (например, Windows 7 вставит идеографическое пространство, а iOS вставит пробел ASCII).

Так чтоЯ хочу, по сути, «набор всех символов, которые визуально выглядят как пробел и могут быть сгенерированы, когда пользователь нажимает клавишу пробела или клавишу табуляции, так как многие пользователи не знают разницу между пробелом и табуляцией, на японском и/ или английский ".

Есть ли какой-нибудь авторитетный ответ на такой вопрос?

Ответы [ 2 ]

4 голосов
/ 29 ноября 2010

Вам нужны вкладка ASCII, пробел и неразрывный пробел (U + 00A0) и пробел во всю ширину, который вы правильно определили как U + 3000.Возможно, вам понадобятся символы новой строки и вертикальные пробелы.Если вы используете Unicode (не Shift-JIS и т. Д.), Тогда это все, что вам нужно.Существуют и другие (управляющие) символы, такие как \ 0 NULL, которые иногда используются в качестве разделителей информации, но они не будут отображаться в качестве пробела в восточноазиатском тексте, т. Е. Они не будут отображаться в виде пробела.

edit: Мэтт Болл имеет хороший комментарий в своем комментарии, но, как показывает его пример, многие реализации регулярных выражений плохо справляются с пунктуацией Восточной Азии на всю ширину.В связи с этим стоит упомянуть, что Python string.whitespace тоже не подрезает горчицу.

3 голосов
/ 02 февраля 2011

Я только что нашел ваше сообщение. Это отличное объяснение нормализации символов Юникода.

http://en.wikipedia.org/wiki/Unicode_equivalence

Я обнаружил, что многие языки программирования, такие как Python, имеют модули, которые могут реализовывать эти правила нормализации в стандартах Unicode. Для моих целей я обнаружил, что следующий код Python работает очень хорошо. Он преобразует все варианты пробелов в Юникоде в диапазон 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())

С момента первого написания я узнал, что модуль регулярных выражений Python неправильно обрабатывает эти пробельные символы и может вызвать сбой при обнаружении. Оказывается, более быстрый и надежный метод использования функции .split ().

...