Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何检查域名是否为punycode?

如何检查域名是否为punycode?
EN

Stack Overflow用户
提问于 2016-05-13 11:44:30
回答 4查看 3.7K关注 0票数 2

好的,我使用PHP类(http://idnaconv.net/index.html)来编码/解码域名。

不幸的是,它似乎没有提供一个接口来检查域名是否已经是punycode。

实现这一目标的最好方法是什么?这将是很好的,如果有人可以张贴源代码如何验证域是punycode或没有(有解释,因为idna_convert代码不是真的对我来说)。我已经知道如何从idna_convert捕获异常。:-)

顺便说一句:当您尝试将域名转换为已经是punycode的punycode时,idna_convert会抛出异常(参见https://github.com/phlylabs/idna-convert/blob/master/src/Punycode.php;第157行)。此外,我真的不明白他们的支票是如何工作的。

EN

回答 4

Stack Overflow用户

发布于 2016-05-13 12:05:03

最简单的方法就是转换它,并检查结果是否等于输入。

EDIT:你可以通过如下的检查来扩展Punycode类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class PunycodeCheck extends Punycode
{
  public function check_encoded($decoded)
  {
      $extract = self::byteLength(self::punycodePrefix);
      $check_pref = $this->UnicodeTranscoder->utf8_ucs4array(self::punycodePrefix);
      $check_deco = array_slice($decoded, 0, $extract);
      if ($check_pref == $check_deco) 
          return true;
      return false;
   }
}
票数 1
EN

Stack Overflow用户

发布于 2016-05-19 22:53:40

这取决于你到底想要什么。

作为第一个基本检查,查看域名是否只包含ASCII字符。如果是,则该域“已经是punycode",从某种意义上说,它不能进一步转换。有关检查字符串是否只包含ASCII字符的信息,请参见Determine if UTF-8 text is all ASCII?

如果最重要的是,您想要检查域是否为IDN形式,在点.处分开域,并检查是否有任何以xn--开头的子串。

如果除此之外,您还想检查域名是否为IDN以及是否有效,只需尝试使用库的decode函数进行解码即可。

票数 1
EN

Stack Overflow用户

发布于 2018-12-27 03:07:42

检查一个域是否在Punycode中并不是一件很容易的事情。根据@Wladston已经说过的规则,需要进行几次检查才能实现。

这是我从我的库:Helper classes for PrestaShop CMS的组合中提取的ValidateHelper类的改编代码示例。我还添加了测试及其执行结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Validate helper.
 *
 * @author Maksim T. <zapalm@yandex.com>
 */
class ValidateHelper
{
    /**
     * Checks if the given domain is in Punycode.
     *
     * @param string $domain The domain to check.
     *
     * @return bool Whether the domain is in Punycode.
     *
     * @see https://developer.mozilla.org/en-US/docs/Mozilla/Internationalized_domain_names_support_in_Mozilla#ASCII-compatible_encoding_.28ACE.29
     *
     * @author Maksim T. <zapalm@yandex.com>
     */
    public static function isPunycodeDomain($domain)
    {
        $hasPunycode = false;

        foreach (explode('.', $domain) as $part) {
            if (false === static::isAscii($part)) {
                return false;
            }

            if (static::isPunycode($part)) {
                $hasPunycode = true;
            }
        }

        return $hasPunycode;
    }

    /**
     * Checks if the given value is in ASCII character encoding.
     *
     * @param string $value The value to check.
     *
     * @return bool Whether the value is in ASCII character encoding.
     *
     * @see https://en.wikipedia.org/wiki/ASCII
     *
     * @author Maksim T. <zapalm@yandex.com>
     */
    public static function isAscii($value)
    {
        return ('ASCII' === mb_detect_encoding($value, 'ASCII', true));
    }

    /**
     * Checks if the given value is in Punycode.
     *
     * @param string $value The value to check.
     *
     * @return bool Whether the value is in Punycode.
     *
     * @throws \LogicException If the string is not encoded by UTF-8.
     *
     * @see https://en.wikipedia.org/wiki/Punycode
     *
     * @author Maksim T. <zapalm@yandex.com>
     */
    public static function isPunycode($value)
    {
        if (false === static::isAscii($value)) {
            return false;
        }

        if ('UTF-8' !== mb_detect_encoding($value, 'UTF-8', true)) {
            throw new \LogicException('The string should be encoded by UTF-8 to do the right check.');
        }

        return (0 === mb_stripos($value, 'xn--', 0, 'UTF-8'));
    }
}

/**
 * Test Punycode domain validator.
 *
 * @author Maksim T. <zapalm@yandex.com>
 */
class Test
{
    /**
     * Run the test.
     *
     * @author Maksim T. <zapalm@yandex.com>
     */
    public static function run()
    {
        $domains = [
            // White list
            'почта@престашоп.рф'          => false, // Russian, Unicode
            'modulez.ru'                  => false, // English, ASCII
            'xn--80aj2abdcii9c.xn--p1ai'  => true,  // Russian, ASCII
            'xn--80a1acn3a.xn--j1amh'     => true,  // Ukrainian, ASCII
            'xn--srensen-90a.example.com' => true,  // German, ASCII
            'xn--mxahbxey0c.xn--xxaf0a'   => true,  // Greek, ASCII
            'xn--fsqu00a.xn--4rr70v'      => true,  // Chinese, ASCII

            // Black List
            'xn--престашоп.xn--рф'        => false, // Russian, Unicode
            'xn--prestashop.рф'           => false, // Russian, Unicode
        ];

        foreach ($domains as $domain => $isPunycode) {
            echo 'TEST: ' . $domain . (ValidateHelper::isPunycodeDomain($domain)
                ? ' is in Punycode [' . ($isPunycode ? 'OK' : 'FAIL') . ']'
                : ' is NOT in Punycode [' . (false === $isPunycode ? 'OK' : 'FAIL') . ']'
            ) . PHP_EOL;
        }
    }
}

Test::run();

// The output result:
//
// TEST: почта@престашоп.рф is NOT in Punycode [OK]
// TEST: modulez.ru is NOT in Punycode [OK]
// TEST: xn--80aj2abdcii9c.xn--p1ai is in Punycode [OK]
// TEST: xn--80a1acn3a.xn--j1amh is in Punycode [OK]
// TEST: xn--srensen-90a.example.com is in Punycode [OK]
// TEST: xn--mxahbxey0c.xn--xxaf0a is in Punycode [OK]
// TEST: xn--fsqu00a.xn--4rr70v is in Punycode [OK]
// TEST: xn--престашоп.xn--рф is NOT in Punycode [OK]
// TEST: xn--prestashop.рф is NOT in Punycode [OK]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37209239

复制
相关文章
QT(C++)面试总结
QT信号槽机制的优缺点 (1)问题: 为什么Qt使用信号与槽机制而不是传统的回调函数机制进行对象间的通信呢?
全栈程序员站长
2022/09/12
2.1K0
QT(C++)面试总结
Qt和C++关系
Qt是一个功能非常完善的c++跨平台图形库,其实与其说图形库倒不如说它是一个与MFC类似的应用框架。Qt本身就是使用c++语言实现。
zls365
2020/09/21
3.1K0
C++:28 --- C++内存布局(上)
首先,我们顺次考察C兼容的结构(struct)的布局,单继承,多重继承,以及虚继承; 接着,我们讲成员变量和成员函数的访问,当然,这里面包含虚函数的情况; 再接下来,我们考察构造函数,析构函数,以及特殊的赋值操作符成员函数是如何工作的,数组是如何动态构造和销毁的;
用户3479834
2021/02/03
1.1K0
C++:28 --- C++内存布局(上)
【C++】继承(上)
若有好多类,都有公共的特征,将类中的特性提取出来专门放在一个类中,这个类一般叫做基类或者父类
lovevivi
2023/05/07
2820
【C++】继承(上)
C++语言的特点 【上】
C++语言是在C语言的基础上发展而来,同时它又支持面向对象的程序设计,它主要具有以下特点:
编程范 源代码公司
2019/10/15
1.2K0
CTK完整教程(OSGI for C++ 实现 C++ Qt 模块化)
CTK框架实际应用比较可靠,但网上资料很少。本教程围绕 CTK Plugin Framework,探索 C++ 中的模块化技术,并能够基于 CTK 快速搭建 C++ 组件化框架,避免后来的人走弯路。本教程的源码下载地址:项目源代码[1]。
沙漠尽头的狼
2022/04/18
8K0
最新免费Qt视频:Qt 5.9 C++开发指南
今天分享一个B站的C++ Qt视频教程,2021年07月录制的,还是比较新,有需要的朋友可以去看看:Qt 5.9 C++开发指南
沙漠尽头的狼
2022/04/18
8140
C++核心编程(上)
结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了
C语言与CPP编程
2020/12/02
1.9K0
Mac上写C++
      用惯Windows的同学可能刚开始用Mac的时候并不知道如何写C++,我刚开始在Mac上写C++的时候也遇到过这个困扰,Mac上并没有Windows上自己用习惯的Visual C++,下面
希希里之海
2018/05/16
2.5K0
C++之模板(上)
本文介绍了C++模板的基础概念,简单介绍了泛型编程,模板,以及模板中的函数模板与类模板等相关概念。
摘星
2023/04/28
4120
C++之模板(上)
C++之引用(上)
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。下面我用两个例子简单介绍一下引用。 生活中的例子:水浒传里的宋江,他父母给他取的名字是宋江,江湖人称他为及时雨(这里及时雨就是对宋江这个人的引用)。 编程上的例子:
摘星
2023/04/28
2790
C++之引用(上)
QT(C++)连接MySQL中文乱码解决
1、QSqlDatabase对象设置UTF-8编码 QSqlDatabase db; db.exec("SET NAMES 'UTF-8'"); 2、将MySQL编码设置成UTF-8 show variables like 'character_set_%'; set character_set_client=utf-8; set character_set_connection=utf-8; set character_set_database=utf-8; set character_set_resul
静谧星空TEL
2021/04/27
3.5K0
C++学习:从基础到QT实现
​ c++基于c语言的扩展, 头文件, 文件后缀, 编译, 输入输出,堆内存,引用,命名空间,函数
天天Lotay
2022/11/11
7800
C++学习:从基础到QT实现
C++ 线程池的实现(上)
最近工作开始使用C++,于是想用C++实现一个线程池。这里就分两篇文章来记录一下实现的过程,本篇主要为理论篇,具体的实践篇,等代码功能稳定以后再总结。
开源519
2020/12/14
1.5K0
C++ 线程池的实现(上)
Qt(C++)使用SQLite数据库完成数据增删改查
当前文章介绍的设计的主要功能是利用 SQLite 数据库实现宠物投喂器上传数据的存储,并且支持数据的增删改查操作。其中,宠物投喂器上传的数据包括投喂间隔时间、水温、剩余重量等参数。
DS小龙哥
2023/07/24
1.2K0
Qt(C++)使用SQLite数据库完成数据增删改查
C++学习(一五九)Qt的场景图Scene Graph
叫场景树更合适,本质不是图。QML场景中的Qt Quick项目将填充QSGNode实例树。
全栈程序员站长
2022/11/15
2.4K0
C++中的stack类、QT中的QStack类
C++中的stack 实现一种先进后出的数据结构,是一个模板类. 头文件 #include<stack> 用法(以int型为例): stack <int> s;           //定义一个int型栈 s.empty(); //返回栈是否为空 s.size(); //返回当前栈中元素的个数 s.push(); //在栈顶上堆进一个元素 s.pop();
诺谦
2018/04/27
2.1K0
C++中的queue类、QT中的QQueue类
C++中的queue 实现一种先进先出的数据结构,是一个模板类 头文件 #include<queue> 用法(以int型为例): queue<int> Q;     //定义一个int型队列 Q.empty();   //返回队列是否为空 Q.size(); //返回当前队列长度 Q.front(); //返回当前队列的第一个元素 Q.back();
诺谦
2018/04/27
3.5K0
C++类和对象(上)
C++在原C语言的基础上新增了面向对象(Object-Oriented)的思想,使其从一门关注解题方法与过程的语言转变为关注解题对象的语言,对于C++来说,万物皆可是对象,下面跟随我的脚步,一起走进C++类和对象的世界
北 海
2023/07/01
1490
C++类和对象(上)
C++之面向对象(上)
本文开始我们总结关于C++面向对象的相关概念,本文主要介绍C++中用来实现封装功能的类。
摘星
2023/04/28
3360
C++之面向对象(上)

相似问题

从Qt C++备份mysql数据库

10

将数据库文件备份为QT C++上的zip文件中的sql

114

sqlite备份内存数据库c++

13

C++ Qt数据库连接问题

15

C++/Qt: QCoreApplicationPrivate::sendPostedEvents上崩溃

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文