Javascript实现Punycode编码/解码

news2024/10/13 1:44:02

Punycode编码/解码的Javascript实现。

用法

const punycode = require('punycode');
console.log(punycode.encode('用法')); //nwwn1p
console.log(punycode.decode('nwwn1p')) //用法

console.log(punycode.toIDN('用法.中国')); //xn--nwwn1p.xn--fiqs8s
console.log(punycode.fromIDN('xn--nwwn1p.xn--fiqs8s')) //用法.中国

源代码

module.exports = (function() {
	var B = 1;
	var w = 26;
	var A = 36;
	var s = 128;
	var C = 72;
	var z = 700;
	var r = 38;
	var t = "-";
	var u = 2147483647;
	var v = {};
	var o = function(d, c) {
		return Math.floor(d / c)
	};
	var x = function(a, c, b) {
		a = o(a, b ? z : 2);
		a = a + o(a, c);
		var d = 0;
		while (a > o((A - B) * w, 2)) {
			a = o(a, A - B);
			d = d + A
		}
		return d + o((A - B + 1) * a, a + r)
	};
	var p = function(a) {
		return a < 128
	};
	var q = function(a) {
		if (a < 26) {
			return a + "a".charCodeAt(0)
		} else {
			if (a < 36) {
				return a - 26 + "0".charCodeAt(0)
			} else {
				return 0
			}
		}
	};
	var y = function(a) {
		if (a - "0".charCodeAt(0) < 10) {
			return a - "0".charCodeAt(0) + 26
		} else {
			if (a - "a".charCodeAt(0) < 26) {
				return a - "a".charCodeAt(0)
			} else {
				return 0
			}
		}
	};
	v.toIDN = function(c) {
		var b = c.split(".");
		var a = 0;
		var d = "";
		for (a = 0; a < b.length; a++) {
			if (/^[0-9a-zA-Z\\-]+$/igm.test(b[a])) {
				d += b[a] + "."
			} else {
				d += "xn--" + v.encode(b[a]) + "."
			}
		}
		if (d != "") {
			d = d.substr(0, d.length - 1)
		}
		return d
	};
	v.fromIDN = function(d) {
		var c = d.split(".");
		var a = 0;
		var e = "";
		for (a = 0; a < c.length; a++) {
			var b = c[a];
			if (b.toLowerCase().indexOf("xn--") == 0) {
				e += v.decode(b.substr(4)) + "."
			} else {
				e += b + "."
			}
		}
		if (e != "") {
			e = e.substr(0, e.length - 1)
		}
		return e
	};
	v.encode = function(d) {
		var e = s;
		var c = 0;
		var i = C;
		var b = "";
		var g = 0;
		d = d.split("");
		for (var k = 0; k < d.length; k++) {
			var h = d[k].charCodeAt(0);
			if (p(h)) {
				b += d[k];
				g++
			}
		}
		if (g > 0) {
			b += t
		}
		var j = g;
		while (j < d.length) {
			var n = u;
			for (var k = 0; k < d.length; k++) {
				var h = d[k].charCodeAt(0);
				if (h >= e && h < n) {
					n = h
				}
			}
			if (n - e > o(u - c, j + 1)) {
				return ""
			}
			c = c + (n - e) * (j + 1);
			e = n;
			for (var l = 0; l < d.length; l++) {
				var h = d[l].charCodeAt(0);
				if (h < e) {
					c++;
					if (0 == c) {
						return ""
					}
				}
				if (h == e) {
					var f = c;
					for (var m = A;; m += A) {
						var a;
						if (m <= i) {
							a = B
						} else {
							if (m >= i + w) {
								a = w
							} else {
								a = m - i
							}
						} if (f < a) {
							break
						}
						b += String.fromCharCode(q(a + (f - a) % (A - a)));
						f = o(f - a, A - a)
					}
					b += String.fromCharCode(q(f));
					i = x(c, j + 1, j == g);
					c = 0;
					j++
				}
			}
			c++;
			e++
		}
		return b
	};
	v.decode = function(e) {
		var f = s;
		var l = 0;
		var k = C;
		var d = "";
		var j = e.lastIndexOf(t);
		e = e.split("");
		if (j > 0) {
			for (var m = 0; m < j; m++) {
				var i = e[m].charCodeAt(0);
				if (!p(i)) {
					return ""
				}
				d += e[m]
			}
			j++
		} else {
			j = 0
		}
		while (j < e.length) {
			var h = l;
			var c = 1;
			for (var b = A;; b += A) {
				if (j == e.length) {
					return ""
				}
				var i = e[j++].charCodeAt(0);
				var g = y(i);
				if (g > o(u - l, c)) {
					return ""
				}
				l = l + g * c;
				var a;
				if (b <= k) {
					a = B
				} else {
					if (b >= k + w) {
						a = w
					} else {
						a = b - k
					}
				} if (g < a) {
					break
				}
				c = c * (A - a)
			}
			k = x(l - h, d.length + 1, h == 0);
			if (o(l, d.length + 1) > u - f) {
				return ""
			}
			f = f + o(l, d.length + 1);
			l = l % (d.length + 1);
			var n = String.fromCharCode(f);
			if (l == 0) {
				d = n + d
			} else {
				d = d.substr(0, l) + n + d.substr(l)
			}
			l++
		}
		return d
	};
	return v
})();

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AAOS】Android Automotive 13模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r69 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch sdk_car_x86_64-userdebug make -j8 运行效果 emualtor HomeMapAll appsSettings…

CUDA-X

NVIDIA CUDA-X 文章目录 前言一、CUDA-X 微服务CUDA-X 微服务CUDA-X 库二、CUDA-X 数据处理三、CUDA-X AI四、CUDA-X HPC总结前言 适用于 AI 的采用 GPU 加速的微服务和库。 释放 GPU 在 AI 应用程序中的潜能 探索 NVIDIA CUDA-X AI 正在推动变革的 AI 领域和可在其中使用的 G…

win10 解决Qt编译得到的可执行文件 *.exe 无法启动的问题

问题描述 在Qt 5.12.4 写了一个服务端程序&#xff0c;编译可以通过&#xff0c;但是打开debug目录下的可执行文件&#xff0c;就报以下错误&#xff1a; 解决方案 方法一 复制缺失的dll到TCPServer.exe目录下 方法二 可能是系统环境变量没有配好 将你电脑上的Qt安装目录…

linux入门——“权限”

linux中有权限的概念&#xff0c;最常见的就是安装一些命令的时候需要输入sudo来提权&#xff0c;那么为什么要有这个东西呢&#xff1f; linux是一个多用户操作系统&#xff0c;很多东西看起来是有很多分&#xff0c;但是实际的存储只有一份&#xff08;比如命令&#xff0c;不…

网站在对抗机器人攻击的斗争中失败了

95% 的高级机器人攻击都未被发现&#xff0c;这一发现表明当前的检测和缓解策略存在缺陷。 这表明&#xff0c;虽然一些组织可能拥有基本的防御能力&#xff0c;但他们没有足够的能力应对更复杂的攻击。 例如利用人工智能和机器学习来模仿人类行为的攻击。 这些统计数据强调…

数据结构之顺序表详解:从原理到C语言实现

引言 在上一篇文章中我们讲到了时间复杂度与空间复杂度&#xff0c;今天我们接着讲数据结构中的内容。 数据的存储和组织方式决定了程序的效率。而顺序表&#xff0c;也就是大家熟悉的数组&#xff0c;正是我们编程中的“起步工具”。它简单易懂&#xff0c;却能帮你解决许多…

python利用电脑默认打开方式打开文件,视频,图片

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理python利用os库打开本地文件的方法。 这个确实比较简单。 利用os库的 os.startfile("mp4") 函数即可用系统默认打开方式打开文件。 这里打开视频进行测试。 import os os.startfile("…

linux 虚拟环境下源码安装DeepSpeed

第一步&#xff1a;创建虚拟环境&#xff1a; conda create -n deepspeed python3.10 第二步&#xff1a;进入虚拟环境&#xff0c;安装Pytorch 2.3.1 # CUDA 12.1 conda install pytorch2.3.1 torchvision0.18.1 torchaudio2.3.1 pytorch-cuda12.1 -c pytorch -c nvidia 第…

谷粒商城(学习笔记)

配置刷新的注解 数据表中不存在的数据 gateway路径重写 CORS跨域 调整路由顺序&#xff1a; TODO是什么:备忘录 逻辑删除 axios有请求缓存&#xff1a; 请求的模版&#xff01; 删除成功后&#xff0c;重新获取数据&#xff01; 删除成功之后&#xff0c;还有提示消息 删除成功…

八大排序--08快速排序

现有 arr {4,8,9,2,7}数组&#xff0c;请用快速排序的方式实现从小到大排序&#xff1a; 方法&#xff1a; 1.定义待排序数组中的第一个值为基准数&#xff1b; 2.定义j游标&#xff0c;从后向前移动找到第一个比基准数小的值停下&#xff1b; 3.定义i游标&#xff0c;从后向…

自定义注解和组件扫描在Spring Boot中动态注册Bean(一)

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在Spring Boot中&#xff0c;自定义注解和组件扫描是两种强大的机制&#xff0c;它们允许开发者以声明性的方式动态注册Bean。这种方式不仅提高了代码的可读性和可维护性&#xff0c;还使得Spring Boot应用的…

区域识别——基于python语言

目录 目录 1.水域识别 2.模型介绍 3.文件框架 4.代码示例 4.1 data_preprocess.py 4.2 model1.0.py 4.3 train2.0.py 4.4 predict.py 4.5 运行结果 5.总结 1.水域识别 人眼看见河道可以直接分辨出这是河道&#xff0c;但是如何让计算机也能识别出这是河道呢&#x…

无序中的秩序:Transformer模型的创新性结构解析

最近我在看论文时&#xff0c;发现很多都在用 Transformer 模型&#xff0c;我知道transformer很有名&#xff0c;但是我也只是听说过他的大名&#xff0c;不知道他具体是做什么怎么做的&#xff0c;因此我决定深入了解一下&#xff0c;并做个简单记录&#xff0c;方便以后参考…

TDC上YARN Web-UI 查看application日志方法

方法一 #通过浏览器访问tdc&#xff0c;访问的工作节点对于TDC都是外部节点。在提交给yarn任务后&#xff0c;YarnRM的Web UI 可以展示yarnnm上运行的application日志&#xff0c;但是由于跳转的svc地址&#xff0c;无法直接访问。 #在tdc界面上找到yarn实例&#xff0c;进入ya…

【Scala入门学习】集合常用方法和函数操作

1. foreach循环遍历 foreach 方法的原型&#xff1a; // f 返回的类型是Unit&#xff0c; foreach 返回的类型是Unit def foreach[U](f: Elem > U) 该方法接受一个函数 f 作为参数&#xff0c; 函数 f 的类型为Elem > U&#xff0c;即 f 接受一个参数&#xff0c;参数…

达梦数据库(DM)单机典型安装

达梦数据库&#xff08;DM&#xff09;单机典型安装 环境&#xff1a;centos7.6 1、创建用户 #增加用户和组&#xff0c;用于安装管理达梦数据库。 新建用户组&#xff1a;groupadd dinstall 新建用户&#xff1a;指定用户组&#xff0c;家目录&#xff0c;shell。useradd -g…

反转链表解题思路

题目描述 给定一个单链表的头结点pHead&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 示例&#xff1a;当输入链表{1,2,3}时&#xff0c;经反转后&#xff0c;原链表变为{3,2,1}&#xff0c;所以对应的输出为{3,2,1}。 解题思路&#xff1a;迭…

股市大涨下的会展业创新者

近期&#xff0c;股市涨势强劲有力&#xff0c;各大指数普遍上扬&#xff0c;市场活力空前。与此同时&#xff0c;伴随全球经济逐步复苏及会展行业不断发展&#xff0c;上市展览公司机遇与挑战并存。国内外市场需求持续增长拓展了广阔发展空间&#xff0c;但同时行业竞争愈发激…

中国宏观经济与产业发展:挑战与机遇并存

#长沙屿# 在复杂多变的国内外经济形势之下&#xff0c;中国经济已然步入一个至关重要的发展阶段。今日&#xff0c;让我们深入剖析当前经济形势&#xff0c;对中国宏观经济的运行现状及产业发展的趋势展开深度探讨。 2024年&#xff0c;中国经济运行总体平稳、稳中有进&#x…

职场启悟:没有靠山的你,45岁前必知的5大潜规则

我是农村孩子&#xff0c;父母都是农民&#xff0c;毕业一切都是靠着自己找工作&#xff0c;在陌生的大城市除了认识老师就是同学。记得那是我初入职场的第三个月&#xff0c;每天我都沉浸在无尽的工作中&#xff0c;加班到深夜&#xff0c;周末也时常无休。我觉的农村孩子只能…