Как определить, образует ли последовательность точек кода натуральный символ? - PullRequest
4 голосов
/ 28 января 2012

Добрый день всем,

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

Anнеестественное объединение диакритической последовательности - это последовательность кодовых точек Юникода, которая при объединении выдает выходные данные, которые не принадлежат ни одному языку под солнцем (древние сценарии / языки считаются естественными языками).

Например, заданная строкаввод:

   "aaà̴̵̶̷̸̡̢̧̨̛̖̗̘̙̜̝̞̟̠̣̤̥̦̩̪̫̬̭̮̯̯̰̱̲̳̹̺̻̼͇͈͉͍͎́̂̃̄̅̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̽̾̿̀́͂̓̈́͆͊͋͌̕̚͠͡ͅaa" //code points 0061 0061 0061 0300 0301 0302 0303 0304 0305 0306 0307 0308 0309 030a 030b 030c 030d 030e 030f 0310 0311 0312 0313 0314 0315 0316 0317 0318 0319 031a 031b 031c 031d 031e 031f 0320 0321 0322 0323 0324 0325 0326 0327 0328 0329 032a 032b 032c 032d 032e 032f 032f 0330 0331 0332 0333 0334 0335 0336 0337 0338 0339 033a 033b 033c 033d 033e 033f 0340 0341 0342 0343 0344 0345 0346 0347 0348 0349 034a 034b 034c 034d 034e 0360 0361 0061 0061

, функция должна возвращать результат aaàaa (кодовые точки 0061 0061 0061 0300 0061 0061),

С à́ (кодовые точки 0061 0300 0301) isnне персонаж на любом естественном языке.Другими словами:

  assert F("aaà̴̵̶̷̸̡̢̧̨̛̖̗̘̙̜̝̞̟̠̣̤̥̦̩̪̫̬̭̮̯̯̰̱̲̳̹̺̻̼͇͈͉͍͎́̂̃̄̅̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̽̾̿̀́͂̓̈́͆͊͋͌̕̚͠͡ͅaa").equals("aaàaa");

Или для исходного кода, сохраненного с использованием латинских кодировок:

 assert F("\u0061\u0061\u0061\u0300\u0301\u0302\u0303\u0304\u0305\u0306\u0307\u0308\u0309\u030a\u030b\u030c\u030d\u030e\u030f\u0310\u0311\u0312\u0313\u0314\u0315\u0316\u0317\u0318\u0319\u031a\u031b\u031c\u031d\u031e\u031f\u0320\u0321\u0322\u0323\u0324\u0325\u0326\u0327\u0328\u0329\u032a\u032b\u032c\u032d\u032e\u032f\u032f\u0330\u0331\u0332\u0333\u0334\u0335\u0336\u0337\u0338\u0339\u033a\u033b\u033c\u033d\u033e\u033f\u0340\u0341\u0342\u0343\u0344\u0345\u0346\u0347\u0348\u0349\u034a\u034b\u034c\u034d\u034e\u0360\u0361\u0061\u0061").equals("\u0061\u0061\u0061\u0300\u0061\u0061");

Как нам определить, является ли последовательность символов или последовательность кодовых точек юникода natural ?

Или, скорее, есть ли предел тому, сколько комбинаций диакритических знаков будет использовать символ, принадлежащий к естественному языку?

Ответы [ 3 ]

2 голосов
/ 29 января 2012

Юникод 6.0 :

Все комбинирующие символы могут быть применены к любому базовому символу и, в принципе, могут быть использованы с любым сценарием. Как и в случае с другими символами, выделение комбинирующего символа одному блок или другое идентифицирует только его основное использование; он не предназначен для определения или ограничения диапазон символов, к которым он может быть применен. В стандарте Юникод все последовательности разрешены коды символов.

Это не создает обязательство для реализаций поддерживать все возможные комбинации Одинаково хорошо. Таким образом, при применении арабской аннотации к ханьскому символу или согласный Деванагари разрешен, он вряд ли будет хорошо поддерживаться при или иметь много смысла.

В данных Unicode вряд ли будет достаточно информации, чтобы сделать это алгоритмически.

Существуют некоторые правила для канонической композиции / разложения , которые можно использовать, чтобы определить, является ли последовательность «естественной» последовательностью. Например, отображение U + 0065 U + 0301 в U + 00E9 (é.) Но это не будет работать для каждого случая.

Кроме того, я не уверен, что вы могли бы сделать без использования какой-либо таблицы валидации, созданной экспертами или сгенерированной из некоторого совокупности языковых данных.

1 голос
/ 29 января 2012

Неестественная объединяющая диакритическая последовательность - это последовательность кодовых точек Юникода, которая при объединении выдает выходные данные, которые не принадлежат ни одному языку под солнцем

Боюсь, вы не сможете удовлетворить это требование, не зная всех языков под солнцем.

Самое близкое, что вы можете сделать только со стандартным набором данных Unicode, - это нормализоваться до NFKC и посмотреть, остались ли какие-либо разложенные символы класса объединения. Это ничего не говорит вам о естественных языках, оно опирается только на эвристику, которая, вероятно, будет комбинированным символом, определенным для комбинаций, которые обычно используются. Это справедливо для наиболее распространенных простых алфавитов, которых может быть достаточно для вас.

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

Нет. В UAX 15 существует практический предел, согласно которому в тексте, защищенном от потоков, не должно использоваться 30 последовательных символов объединения, что позволило бы нам предположить, что стандарт Unicode в целом будет пытаться избегать определений символов, которые могли бы привести к тому, что много последовательных участников присоединятся к реальному языковому варианту использования.

Самое длинное из известных мне природных графемных кластеров:

ཧྐྵྨླྺྼྻྂ

(один начальный символ и восемь непробиваемых знаков.)

1 голос
/ 28 января 2012

Я думаю, что вам просто нужно Character.isLetter().Я только что попробовал его с английскими, русскими и ивритскими символами, и он возвращает true для всех букв и false для всех символов, которые не являются буквами.

Я не знаю, такие ли символы, как '.', 'и т. д. естественны, но вы можете легко перечислить все эти символы, если они вам нужны.

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