Где найти все 137 929 именованных символов Unicode в 12.1 в загружаемом формате - PullRequest
2 голосов
/ 05 июня 2019

Я скачал 12.1.0 данные Unicode, а в файле UnicodeData.txt всего 32 841 строка, поэтому всего ~ 30 тыс. Символов. Интересно, где остальные 105 088 персонажей, я не смог их найти. Хотите знать, если они где-то в Unihan.zip, или если они где-то в UCD.zip. Я не могу найти эту информацию здесь .

Интересно, какие файлы я использую, чтобы получить базу данных всех именованных символов.

Ответы [ 2 ]

6 голосов
/ 05 июня 2019

Некоторые записи в UnicodeData.txt являются символьными диапазонами , как описано в техническом отчете :

Для обратной совместимости, диапазоны вфайл UnicodeData.txt указывается записями для начальных и конечных символов диапазона, а не формой "X..Y".Начальный символ обозначается идентификатором диапазона, за которым следуют запятая и строка «Первый» в угловых скобках.Эта запись заменяет имя обычного символа в поле 1 для этой строки.Конечный символ указывается в следующей строке тем же идентификатором диапазона, за которым следуют запятая и строка «Last» в угловых скобках:

4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
9FEF;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;

Или другими словами, числостроки в файле UnicodeData.txt не совпадают с количеством символов в базе данных.Некоторые диапазоны символов состоят из сотен или тысяч символов, закодированных всего в 2 строки.

3 голосов
/ 05 июня 2019

@ CraigBarnes правильно, что UnicodeData.txt содержит все символы. Вот некоторые доказательства (код Python):

import csv

D = {}

with open('UnicodeData.txt',encoding='utf-8-sig') as f:
    r = csv.reader(f,delimiter=';')
    for line in r:
        # Count all the CJK Ideograph and Hangul Syllable ranges and generate names
        if ('Ideograph' in line[1] or line[1].startswith('<Hangul')) and line[1].endswith('First>'):
            end = next(r)
            for i in range(int(line[0],16),int(end[0],16)+1):
                D[i] = [line[1][1:-8].upper() + '-' + f'{i:04X}'] + line[2:]
        elif line[1][0] == '<':
            continue # skip private use and control characters
        else:
            D[int(line[0],16)] = line[1:] # count everything else as one entry

print(len(D))

Выход:

137929
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...