14
Невозможно (без использования огромного стола) отличить японское кандзи от хан-иероглифа, не используемого в японском языке (например, китайский или корейский вариант).
Если вы просто хотите обнаружить любую идеографию Хана в базовом диапазоне (от \ u4e00 до \ u9fff), тогда они кодируются в 3 байта, первый байт всегда между 0xe4 и 0xe9, второй и третий байты между 0x80 и 0xbf.
Здесь есть две трудности: во-первых, вы должны сказать grep, что хотите следить за байтами, а не за символами; затем необходимо ввести байты 0xe4, 0xe9, 0x80 и 0xbf, чтобы поместить их в выражение регулярного выражения.
Я обнаружил, что ключ -P делает оба; и строка, которую вы хотите:
grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]"
и если вы хотите кана тоже:
grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]|\xe3[\x81-\x83][\x80-\xbf]"
В соответствии с пятым столом здесь , кандзи являются caracters между
\u4e00
и\u9fff
Моя реализация
grep
, похоже, не в состоянии обрабатывать символы Юникода (это GNU grep 2.14 в Archlinux), но мы все еще можем использовать\x
. Вы можете найти соответствующие коды здесь или использовать инструмент, какhexedit
получить их.Для всего, что находится в нашем диапазоне интересов,
e9 be a5
возвращается «Неверный символ сортировки», поэтому я пришел к такому выводу:источник
grep "[一-龥]"
. проблема в том, что он зависит от локали и использует правила сопоставления; то есть только элементы, для которых определен порядок сортировки, могут использоваться в диапазоне или совпадать.-P
Переключатель просто делает двоичное соответствие, независимо от языка. Подход, основанный на локали, будет использовать культурное определение «диапазона символов», а подход, основанный на двоичном коде, будет использовать определение значения кодирования «диапазона». В частности, для алфавитных скриптов вывод совсем другой. (здесь для идеографии Хана это примерно эквивалентно)