拉丁文字支持多种语言,我想确保输入字符在一种语言(例如英语或德语)内,而不仅仅是在拉丁文字内。
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));
}
}