PHP是否提供了一种确定unicode代码点是否属于特定语言而不仅仅是特定脚本的方法。?

PHP是否提供了一种确定unicode代码点是否属于特定语言而不仅仅是特定脚本的方法。?,php,codepoint,Php,Codepoint,拉丁语脚本支持多种语言,我希望确保输入字符在一种语言(例如英语或德语)中,而不仅仅是在拉丁语脚本中 Unicode被划分为块,块不一定是特定于语言的。美洲和欧洲使用基本拉丁语和拉丁语-1补语块,但特别是带有重音的法语字符与带有拉丁语-1补语块重音的德语字符混合。所以,如果我只想要法语字符,我是否必须构建自己的合法字符数组,或者是否有资源(以及所有其他语言) IntlChar类越来越近,但并没有解决这个问题。可以从解析的每个字符中获取Unicode块作为属性。但是如果IntlChar能够识别语言环

拉丁语脚本支持多种语言,我希望确保输入字符在一种语言(例如英语或德语)中,而不仅仅是在拉丁语脚本中

Unicode被划分为块,块不一定是特定于语言的。美洲和欧洲使用基本拉丁语和拉丁语-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));

    }

}

这有一个问题:一个字符可以属于多种语言-
é[带锐音符的拉丁文小写字母E]
可以是法语,或者任何斯拉夫语,或者葡萄牙语。这是一个Risqueé命题,并开启了一个潜在问题的smörgåsbord。-看到我在那里做了什么吗?这是“英语”…)最好的办法是定义自己的有效字符集并根据它进行验证。部分解决方案是使用unicode代码点范围检查正则表达式。就像我会使用
preg_match('#[a-ža-Ž]#u',$character)
进行一个简单的测试,如果一个字符属于立陶宛语言。这种方法的问题是立陶宛字母分散在不同的unicode代码点块上,因此,此正则表达式还将匹配相同
0x0061-0x017E
范围内的其他unicode字符,例如
µ¨¾
等。但是如果您不关心超级质量,这可能没问题。对于Piskvor的回答,我认为代码点和语言之间的一对多关系没有问题(正如Piskvor指出的那样,这显然是事实!)对于deceze的观点,我明白了(聪明的回答!)。但我认为,有时候你可能会希望文本输入仅限于特定语言。但根据这些回答,听起来正则表达式或字符数组是实现这一点的唯一方法。显然,如果你打算在应用程序中支持多种语言,这就需要做大量工作。