2

拉丁文字支持多种语言,我想确保输入字符在一种语言(例如英语或德语)内,而不仅仅是在拉丁文字内。

Unicode 分为块,块不一定是特定于语言的。美国和欧洲使用 Basic Latin 和 Latin-1 Supplement 块,但特别是带有重音的法语字符在 Latin-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));

    }

}
4

0 回答 0