Предлагает ли PHP способ определить, принадлежит ли код Unicode к определенному языку, а не только к конкретному сценарию. - PullRequest
2 голосов
/ 03 июля 2019

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

Юникод разделен на блоки иблоки не обязательно зависят от языка.Америка и Европа используют блоки дополнения «Базовая латиница» и «Латинская 1», но, в частности, французские символы с акцентами смешиваются с немецкими символами с акцентами в блоке «Латинская 1».Поэтому, если мне нужны только французские символы, нужно ли мне создавать собственный массив допустимых символов или есть ресурс для этого (и всех других языков)?

Класс IntlChar становится ближе, но не решает эту проблему.проблема.Вы можете получить блок Unicode как свойство каждого анализируемого символа.Но было бы неплохо, если бы IntlChar знал о локали, поскольку строка локали указала бы язык и, возможно, дала бы большую точность.Я знаю, что IntlChar основан на библиотеке ICU, и поэтому язык PHP вряд ли изменит свою реализацию.

use PHPUnit\Framework\TestCase;

class CharacterTest extends TestCase {

    function testFrenchCharacter() {
        $e_with_acute = "\u{00E9}";
        $snowman = "\u{2603}";

        $this->assertFalse(ctype_alpha($e_with_acute));

        setLocale(LC_CTYPE, 'fr-FR');

        // ctype_alpha is NOT locale aware
        $this->assertFalse(ctype_alpha($e_with_acute));

        // \IntlChar::isalpha is not locale aware either but handles Unicode characters
        $this->assertFalse(\IntlChar::isalpha($snowman));

        $this->assertEquals(\IntlChar::CHAR_CATEGORY_LOWERCASE_LETTER, \IntlChar::charType($e_with_acute));

        $this->assertTrue(\IntlChar::isalpha($e_with_acute));

    }

}
...