当前位置:首页 > PHP

php实现punycode

2026-02-28 09:05:32PHP

PHP 实现 Punycode

Punycode 是一种用于将 Unicode 字符串转换为 ASCII 字符串的编码方式,常用于国际化域名(IDN)的处理。以下是几种在 PHP 中实现 Punycode 转换的方法。

使用内置函数 idn_to_asciiidn_to_utf8

PHP 提供了内置函数 idn_to_asciiidn_to_utf8,可以方便地进行 Punycode 编码和解码。这些函数需要 PHP 安装 intl 扩展。

// 编码为 Punycode
$domain = "例子.测试";
$punycode = idn_to_ascii($domain, IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46);
echo $punycode; // 输出: xn--fsq.xn--0zwm56d

// 解码为 Unicode
$original = idn_to_utf8($punycode, IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46);
echo $original; // 输出: 例子.测试

使用第三方库

如果无法使用 intl 扩展,可以使用第三方库如 true/punycode

安装库:

composer require true/punycode

使用示例:

use True\Punycode;

$punycode = new Punycode();

// 编码为 Punycode
$encoded = $punycode->encode('例子.测试');
echo $encoded; // 输出: xn--fsq.xn--0zwm56d

// 解码为 Unicode
$decoded = $punycode->decode($encoded);
echo $decoded; // 输出: 例子.测试

手动实现 Punycode 算法

如果需要手动实现 Punycode 算法,可以参考以下简化代码(仅用于学习,实际项目中建议使用内置函数或第三方库)。

php实现punycode

function punycode_encode($input) {
    $output = '';
    $n = 128;
    $delta = 0;
    $bias = 72;
    $basic_length = 0;

    // 处理基本字符
    for ($i = 0; $i < strlen($input); $i++) {
        if (ord($input[$i]) < 128) {
            $output .= $input[$i];
            $basic_length++;
        }
    }

    if ($basic_length > 0) {
        $output .= '-';
    }

    $h = $b = $basic_length;
    while ($h < strlen($input)) {
        $m = 0x10FFFF;
        for ($i = 0; $i < strlen($input); $i++) {
            $c = ord($input[$i]);
            if ($c >= $n && $c < $m) {
                $m = $c;
            }
        }

        $delta += ($m - $n) * ($h + 1);
        $n = $m;

        for ($i = 0; $i < strlen($input); $i++) {
            $c = ord($input[$i]);
            if ($c < $n) {
                $delta++;
            } elseif ($c == $n) {
                $q = $delta;
                for ($k = 36;; $k += 36) {
                    $t = ($k <= $bias) ? 1 : (($k >= $bias + 26) ? 26 : ($k - $bias));
                    if ($q < $t) break;
                    $output .= chr($t + ($q - $t) % (36 - $t) + 97);
                    $q = floor(($q - $t) / (36 - $t));
                }

                $output .= chr($q + 97);
                $bias = adapt($delta, $h + 1, $h == $b);
                $delta = 0;
                $h++;
            }
        }
        $delta++;
        $n++;
    }

    return 'xn--' . $output;
}

function adapt($delta, $numpoints, $firsttime) {
    $delta = $firsttime ? floor($delta / 700) : floor($delta / 2);
    $delta += floor($delta / $numpoints);
    $k = 0;
    while ($delta > 455) {
        $delta = floor($delta / 35);
        $k += 36;
    }
    return $k + floor(36 * $delta / ($delta + 38));
}

注意事项

  • 使用 idn_to_asciiidn_to_utf8 时,确保 intl 扩展已安装并启用。
  • 第三方库如 true/punycode 提供了更简单的接口,适合没有 intl 扩展的环境。
  • 手动实现 Punycode 算法较为复杂,建议仅在特殊需求时使用。

标签: phppunycode
分享给朋友:

相关文章

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php搜索功能实现

php搜索功能实现

实现基本的PHP搜索功能 使用MySQL数据库和PHP实现简单的关键词搜索功能。需要确保数据库中有可供搜索的表和数据。 // 连接数据库 $conn = new mysqli('localhost'…

php实现重定向

php实现重定向

使用header函数进行重定向 在PHP中,header()函数是实现重定向的常用方法。通过发送HTTP头信息Location,浏览器会自动跳转到指定URL。需确保在调用header()前没有输出任何…

php实现秒杀

php实现秒杀

PHP实现秒杀功能的关键技术 秒杀系统需要解决高并发、数据一致性、系统稳定性等问题。以下是PHP实现秒杀功能的核心技术方案: 数据库优化 使用InnoDB引擎的行级锁和事务特性,确保数据一致性。商品…

php 实现路由

php 实现路由

PHP 实现路由的方法 在 PHP 中实现路由功能可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 PHP 实现简单路由 通过解析 URL 并匹配对应的处理逻辑,可以实现基本的路由功能。以…