spinitron/precis

实现了 PRECIS 框架,IDNA 双向规则,Unicode 双向属性

0.3.2 2018-02-18 01:06 UTC

This package is not auto-updated.

Last update: 2024-09-24 16:07:59 UTC


README

摘要

PRECIS,"国际化字符串的准备、执行和比较",是一个处理表示网络地址、标识符和密码以及昵称的 Unicode 字符串的框架。

在 PRECIS 术语中,客户端(例如 Web 浏览器)在将字符串(例如用户名、密码)发送到网络之前先对其进行 准备。服务器(例如 PHP Web 应用程序)在接收和使用字符串之前对字符串 执行 特定规则(例如检查不允许的字符、大小写映射等)。执行涉及接受/拒绝决策,可能需要使用 PRECIS 配置文件特定的规范化方式来更改字符串。比较两个字符串时,都在比较之前执行执行。如果比较中使用了哈希函数(例如密码),则在哈希和比较之前进行执行。

PRECIS RFC 标准化了此类准备和执行(废弃了旧标准),此包提供了 PHP 实现。

功能

Precis 类提供了静态方法来

为了实现这些,需要某些 PHP 7.0 之前 PHP 中缺少的 Unicode 功能。该包有一个其他类作为临时解决方案。

(注意:此包 v0.1.1 中的 CaseFold 类在 PRECIS 在修订的 RFC 中删除后被移除。)

方法

所有公共方法都是静态的。

// test for PRECIS string classes
public static function isIdentifier(string $string): bool
public static function isFreeform(string $string): bool

// prepare for PRECIS profiles
public static function prepareUsernameCaseMapped(string $string): string|bool
public static function prepareUsernameCasePreserved(string $string): string|bool
public static function prepareOpaqueString(string $string): string|bool
public static function prepareNickname(string $string): string|bool

// enforce PRECIS profiles
public static function enforceUsernameCaseMapped(string $string): string|bool
public static function enforceUsernameCasePreserved(string $string): string|bool
public static function enforceOpaqueString(string $string): string|bool
public static function enforceNickname(string $string): string|bool

此包还有一些在 PHP 7 引入 IntlChar 类之前所需的通用 Unicode 工具。这些保留至今,因为我们目前仍维护 PHP 5.4 兼容性。我们继续使用 mbstring 进行 Unicode toLowerCase() 操作。

// general UTF-8 character utilities
public static function utf8chr(int $ord): string|null
public static function utf8ord(string $string, int $pos = 0): int
public static function codePoint2utf8(string $codePoint): string|null|false
public static function utf82CodePoint(string $string, int $pos = 0, string $style = 'U+'): string

// Unicode Bidi class and IDNA Bidi rule
Bidi::getClass(string $char): string 
public static function rule(string $string): bool

数据

Bidi 类有自己的“数据特性”,其中包含从 Unicode 字符数据库中获取的相关数据。它们是 PHP 类,以便利用 opcache。它们是特性而不是因为我计划在其他地方重用它们,而是为了方便。首先,因为它们是从 UCD 自动生成的,其次,因为在同一个编辑器中,没有大数组字面量,更容易处理对应的方法。

数据特性的生成器位于 data 目录。它们下载相关的 UCD 文件并将 PHP 特性类写入标准输出。因此,您可以重新生成它们,例如(假设 php 在您的路径中):

cd path/to/precis/project/dir
php data/generateBidi.php > BidiDataTrait.php
php data/generateCaseFold.php > CaseFoldDataTrait.php

单元测试

Precis 测试是不完整的,因为我找不到 PRECIS 字符类、配置文件或 Bidi 规则的测试向量。

以下内容测试得相对较好:

  • UTF-8 实用函数在每个 Unicode 代码点上进行了测试
  • Bidi::getClass()。注意:此测试从 UCD 下载 UnicideData.txt(1.5 MB)
  • CONTEXTO 和 CONTEXTJ 规则
  • Precis::getPrecisProperty()

DerivedPropertyValueTest 使用来自 IANA(https://www.iana.org/assignments/precis-tables-6.3.0/precis-tables-6.3.0.xhtml)的派生属性值表,该表停留在 Unicode 6.3.0。因此,我们忽略 IANA 表说 UNASSIGNED 而 Precis 说其他内容的情况。

版权和许可