Как определить все неосновные символы UTF-8 в наборе строк в Perl - PullRequest
2 голосов
/ 23 марта 2011

Я использую Perl XML :: Writer для генерации файла импорта для программы под названием OpenNMS. В соответствии с документацией мне нужно предварительно объявить все специальные символы как объявления XML ENTITY. Очевидно, мне нужно просмотреть все экспортируемые строки и каталогизировать используемые специальные символы. Какой самый простой способ определить, какие символы в строке perl являются «специальными» по отношению к кодировке UTF-8? Есть ли способ определить, какими должны быть имена объектов для этих символов?

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

Чтобы найти «специальные» символы, вы можете использовать ord, чтобы найти кодовую точку. Вот пример:

# Create a Unicode test file with some Latin chars, some Cyrillic,
# and some outside the BMP.
# The BMP is the basic multilingual plane, see perluniintro.
# (Not sure what you mean by saying "non-basic".)
perl -CO -lwe "print join '', map chr, 97 .. 100, 0x410 .. 0x415, 0x10000 .. 0x10003" > u.txt

# Read it and find codepoints outside the BMP.
perl -CI -nlwe "print for map ord, grep ord > 0xffff, split //" < u.txt

Хорошее введение вы можете получить, прочитав perluniintro .

Я не уверен, что означают документы в разделе «Экспортированный XML». Похоже на некоторое ограничение системы, которая де-факто является ASCII и не поддерживает Unicode. Или недопонимание XML. Или оба.

В любом случае, если вы ищете имена, вы можете использовать или ссылаться на канонические. См. Определения сущностей XML для символов или один из более старых документов для HTML или MathML, на которые есть ссылки.

1 голос
/ 24 марта 2011

Вы можете заглянуть в программу uniquote .Имеется опция - xml .Например:

$ cat sample
     1  NFD single combining characters:   (crème brûlée et fiancé) and (crème brûlée et fiancé).
     2  NFC single combining characters:   (crème brûlée et fiancé) and (crème brûlée et fiancé).
     3  NFD multiple combining characters: (hẫç̌k) and (hã̂ç̌k).
     3  NFC multiple combining characters: (hẫç̌k) and (hã̂ç̌k).
     5  invisible characters:              (4⁄3⁢π⁢r³) and (4⁄3⁢π⁢r³).
     6  astral characters:                 (? = sqrt[?² + ?²]) and (? = sqrt[?² + ?²]).
     7  astral + combining chars:          (?̅ = sqrt[?̅² + ?̅²]) and (?̅ = sqrt[?̅² + ?̅²]).
     8  wide characters:                   (wide) and (wide).
     9  regular characters:                (normal) and (normal).

$ uniquote -x sample
     1  NFD single combining characters:   (cre\x{300}me bru\x{302}le\x{301}e et fiance\x{301}) and (cre\x{300}me bru\x{302}le\x{301}e et fiance\x{301}).
     2  NFC single combining characters:   (cr\x{E8}me br\x{FB}l\x{E9}e et fianc\x{E9}) and (cr\x{E8}me br\x{FB}l\x{E9}e et fianc\x{E9}).
     3  NFD multiple combining characters: (ha\x{302}\x{303}c\x{327}\x{30C}k) and (ha\x{303}\x{302}c\x{327}\x{30C}k).
     3  NFC multiple combining characters: (h\x{1EAB}\x{E7}\x{30C}k) and (h\x{E3}\x{302}\x{E7}\x{30C}k).
     5  invisible characters:              (4\x{2044}3\x{2062}\x{3C0}\x{2062}r\x{B3}) and (4\x{2044}3\x{2062}\x{3C0}\x{2062}r\x{B3}).
     6  astral characters:                 (\x{1D402} = sqrt[\x{1D400}\x{B2} + \x{1D401}\x{B2}]) and (\x{1D402} = sqrt[\x{1D400}\x{B2} + \x{1D401}\x{B2}]).
     7  astral + combining chars:          (\x{1D402}\x{305} = sqrt[\x{1D400}\x{305}\x{B2} + \x{1D401}\x{305}\x{B2}]) and (\x{1D402}\x{305} = sqrt[\x{1D400}\x{305}\x{B2} + \x{1D401}\x{305}\x{B2}]).
     8  wide characters:                   (\x{FF57}\x{FF49}\x{FF44}\x{FF45}) and (\x{FF57}\x{FF49}\x{FF44}\x{FF45}).
     9  regular characters:                (normal) and (normal).


$ uniquote -b sample
     1  NFD single combining characters:   (cre\xCC\x80me bru\xCC\x82le\xCC\x81e et fiance\xCC\x81) and (cre\xCC\x80me bru\xCC\x82le\xCC\x81e et fiance\xCC\x81).
     2  NFC single combining characters:   (cr\xC3\xA8me br\xC3\xBBl\xC3\xA9e et fianc\xC3\xA9) and (cr\xC3\xA8me br\xC3\xBBl\xC3\xA9e et fianc\xC3\xA9).
     3  NFD multiple combining characters: (ha\xCC\x82\xCC\x83c\xCC\xA7\xCC\x8Ck) and (ha\xCC\x83\xCC\x82c\xCC\xA7\xCC\x8Ck).
     3  NFC multiple combining characters: (h\xE1\xBA\xAB\xC3\xA7\xCC\x8Ck) and (h\xC3\xA3\xCC\x82\xC3\xA7\xCC\x8Ck).
     5  invisible characters:              (4\xE2\x81\x843\xE2\x81\xA2\xCF\x80\xE2\x81\xA2r\xC2\xB3) and (4\xE2\x81\x843\xE2\x81\xA2\xCF\x80\xE2\x81\xA2r\xC2\xB3).
     6  astral characters:                 (\xF0\x9D\x90\x82 = sqrt[\xF0\x9D\x90\x80\xC2\xB2 + \xF0\x9D\x90\x81\xC2\xB2]) and (\xF0\x9D\x90\x82 = sqrt[\xF0\x9D\x90\x80\xC2\xB2 + \xF0\x9D\x90\x81\xC2\xB2]).
     7  astral + combining chars:          (\xF0\x9D\x90\x82\xCC\x85 = sqrt[\xF0\x9D\x90\x80\xCC\x85\xC2\xB2 + \xF0\x9D\x90\x81\xCC\x85\xC2\xB2]) and (\xF0\x9D\x90\x82\xCC\x85 = sqrt[\xF0\x9D\x90\x80\xCC\x85\xC2\xB2 + \xF0\x9D\x90\x81\xCC\x85\xC2\xB2]).
     8  wide characters:                   (\xEF\xBD\x97\xEF\xBD\x89\xEF\xBD\x84\xEF\xBD\x85) and (\xEF\xBD\x97\xEF\xBD\x89\xEF\xBD\x84\xEF\xBD\x85).
     9  regular characters:                (normal) and (normal).

$ uniquote -v sample
     1  NFD single combining characters:   (cre\N{COMBINING GRAVE ACCENT}me bru\N{COMBINING CIRCUMFLEX ACCENT}le\N{COMBINING ACUTE ACCENT}e et fiance\N{COMBINING ACUTE ACCENT}) and (cre\N{COMBINING GRAVE ACCENT}me bru\N{COMBINING CIRCUMFLEX ACCENT}le\N{COMBINING ACUTE ACCENT}e et fiance\N{COMBINING ACUTE ACCENT}).
     2  NFC single combining characters:   (cr\N{LATIN SMALL LETTER E WITH GRAVE}me br\N{LATIN SMALL LETTER U WITH CIRCUMFLEX}l\N{LATIN SMALL LETTER E WITH ACUTE}e et fianc\N{LATIN SMALL LETTER E WITH ACUTE}) and (cr\N{LATIN SMALL LETTER E WITH GRAVE}me br\N{LATIN SMALL LETTER U WITH CIRCUMFLEX}l\N{LATIN SMALL LETTER E WITH ACUTE}e et fianc\N{LATIN SMALL LETTER E WITH ACUTE}).
     3  NFD multiple combining characters: (ha\N{COMBINING CIRCUMFLEX ACCENT}\N{COMBINING TILDE}c\N{COMBINING CEDILLA}\N{COMBINING CARON}k) and (ha\N{COMBINING TILDE}\N{COMBINING CIRCUMFLEX ACCENT}c\N{COMBINING CEDILLA}\N{COMBINING CARON}k).
     3  NFC multiple combining characters: (h\N{LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE}\N{LATIN SMALL LETTER C WITH CEDILLA}\N{COMBINING CARON}k) and (h\N{LATIN SMALL LETTER A WITH TILDE}\N{COMBINING CIRCUMFLEX ACCENT}\N{LATIN SMALL LETTER C WITH CEDILLA}\N{COMBINING CARON}k).
     5  invisible characters:              (4\N{FRACTION SLASH}3\N{INVISIBLE TIMES}\N{GREEK SMALL LETTER PI}\N{INVISIBLE TIMES}r\N{SUPERSCRIPT THREE}) and (4\N{FRACTION SLASH}3\N{INVISIBLE TIMES}\N{GREEK SMALL LETTER PI}\N{INVISIBLE TIMES}r\N{SUPERSCRIPT THREE}).
     6  astral characters:                 (\N{MATHEMATICAL BOLD CAPITAL C} = sqrt[\N{MATHEMATICAL BOLD CAPITAL A}\N{SUPERSCRIPT TWO} + \N{MATHEMATICAL BOLD CAPITAL B}\N{SUPERSCRIPT TWO}]) and (\N{MATHEMATICAL BOLD CAPITAL C} = sqrt[\N{MATHEMATICAL BOLD CAPITAL A}\N{SUPERSCRIPT TWO} + \N{MATHEMATICAL BOLD CAPITAL B}\N{SUPERSCRIPT TWO}]).
     7  astral + combining chars:          (\N{MATHEMATICAL BOLD CAPITAL C}\N{COMBINING OVERLINE} = sqrt[\N{MATHEMATICAL BOLD CAPITAL A}\N{COMBINING OVERLINE}\N{SUPERSCRIPT TWO} + \N{MATHEMATICAL BOLD CAPITAL B}\N{COMBINING OVERLINE}\N{SUPERSCRIPT TWO}]) and (\N{MATHEMATICAL BOLD CAPITAL C}\N{COMBINING OVERLINE} = sqrt[\N{MATHEMATICAL BOLD CAPITAL A}\N{COMBINING OVERLINE}\N{SUPERSCRIPT TWO} + \N{MATHEMATICAL BOLD CAPITAL B}\N{COMBINING OVERLINE}\N{SUPERSCRIPT TWO}]).
     8  wide characters:                   (\N{FULLWIDTH LATIN SMALL LETTER W}\N{FULLWIDTH LATIN SMALL LETTER I}\N{FULLWIDTH LATIN SMALL LETTER D}\N{FULLWIDTH LATIN SMALL LETTER E}) and (\N{FULLWIDTH LATIN SMALL LETTER W}\N{FULLWIDTH LATIN SMALL LETTER I}\N{FULLWIDTH LATIN SMALL LETTER D}\N{FULLWIDTH LATIN SMALL LETTER E}).
     9  regular characters:                (normal) and (normal).

$ uniquote --xml sample
     1  NFD single combining characters:   (cre&#x300;me bru&#x302;le&#x301;e et fiance&#x301;) and (cre&#x300;me bru&#x302;le&#x301;e et fiance&#x301;).
     2  NFC single combining characters:   (cr&#xe8;me br&#xfb;l&#xe9;e et fianc&#xe9;) and (cr&#xe8;me br&#xfb;l&#xe9;e et fianc&#xe9;).
     3  NFD multiple combining characters: (ha&#x302;c&#x327;k) and (ha&#x303;c&#x327;k).
     3  NFC multiple combining characters: (h&#x1eab;k) and (h&#xe3;k).
     5  invisible characters:              (4&#x2044;3&#x2062;r&#xb3;) and (4&#x2044;3&#x2062;r&#xb3;).
     6  astral characters:                 (&#x1d402; = sqrt[&#x1d400; + &#x1d401;]) and (&#x1d402; = sqrt[&#x1d400; + &#x1d401;]).
     7  astral + combining chars:          (&#x1d402; = sqrt[&#x1d400; + &#x1d401;]) and (&#x1d402; = sqrt[&#x1d400; + &#x1d401;]).
     8  wide characters:                   (&#xff57;) and (&#xff57;).
     9  regular characters:                (normal) and (normal).

$ uniquote --verbose --html sample
     1  NFD single combining characters:   (cre&#768;me bru&#770;le&#769;e et fiance&#769;) and (cre&#768;me bru&#770;le&#769;e et fiance&#769;).
     2  NFC single combining characters:   (cr&egrave;me br&ucirc;l&eacute;e et fianc&eacute;) and (cr&egrave;me br&ucirc;l&eacute;e et fianc&eacute;).
     3  NFD multiple combining characters: (ha&#770;&#771;c&#807;&#780;k) and (ha&#771;&#770;c&#807;&#780;k).
     3  NFC multiple combining characters: (h&#7851;&ccedil;&#780;k) and (h&atilde;&#770;&ccedil;&#780;k).
     5  invisible characters:              (4&frasl;3&#8290;&pi;&#8290;r&sup3;) and (4&frasl;3&#8290;&pi;&#8290;r&sup3;).
     6  astral characters:                 (&#119810; = sqrt[&#119808;&sup2; + &#119809;&sup2;]) and (&#119810; = sqrt[&#119808;&sup2; + &#119809;&sup2;]).
     7  astral + combining chars:          (&#119810;&#773; = sqrt[&#119808;&#773;&sup2; + &#119809;&#773;&sup2;]) and (&#119810;&#773; = sqrt[&#119808;&#773;&sup2; + &#119809;&#773;&sup2;]).
     8  wide characters:                   (&#65367;&#65353;&#65348;&#65349;) and (&#65367;&#65353;&#65348;&#65349;).
     9  regular characters:                (normal) and (normal).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...