C#实现Punycode编码/解码

测试代码
string word = "我爱你";
string idn = "我爱你.中国";
string wordCode = PunyCode.Encode(word);
string punycode = PunyCode.IDN2Punycode(idn);Console.WriteLine(word);
Console.WriteLine(wordCode);
Console.WriteLine(PunyCode.Decode(wordCode));Console.WriteLine();Console.WriteLine(idn);
Console.WriteLine(punycode);
Console.WriteLine(PunyCode.Punycode2IDN(punycode));
输出
我爱你
6qq986b3xl
我爱你我爱你.中国
xn--6qq986b3xl.xn--fiqs8s
我爱你.中国
源码
using System;
using System.Text;
using System.Text.RegularExpressions;public class PunyCode
{public static string IDN2Punycode(string input){string[] spli = new string[] { "." };string[] inputArray = input.Split(spli, StringSplitOptions.RemoveEmptyEntries);string retstr = "";for (int i = 0; i < inputArray.Length; i++){Regex myreg = new Regex("^[0-9a-zA-Z\\-]+$");if (myreg.IsMatch(inputArray[i]))retstr += inputArray[i] + ".";elseretstr += "xn--" + Encode(inputArray[i]) + ".";}return retstr.TrimEnd('.');}public static string Punycode2IDN(string input){string[] spli = new string[] { "." };string[] inputArray = input.ToLower().Split(spli, StringSplitOptions.RemoveEmptyEntries);string retstr = "";for (int i = 0; i < inputArray.Length; i++){string tmp = inputArray[i];if (tmp.StartsWith("xn--"))retstr += Decode(tmp.Substring(4)) + ".";elseretstr += tmp + ".";}return retstr.TrimEnd('.');}public static string Encode(string input){int n = 0x80;int delta = 0;int bias = 72;StringBuilder output = new StringBuilder();int b = 0;for (int i = 0; i < input.Length; i++){char c = input[i];if (c < 0x80){output.Append(c);b++;}}if (b > 0) output.Append('-');int h = b;while (h < input.Length){int m = int.MaxValue;for (int i = 0; i < input.Length; i++){int c = input[i];if (c >= n && c < m) m = c;}if (m - n > (int.MaxValue - delta) / (h + 1)) throw new Exception();delta += (m - n) * (h + 1);n = m;for (int j = 0; j < input.Length; j++){int c = input[j];if (c < n){delta++;if (0 == delta) throw new Exception();}if (c == n){int q = delta;for (int k = 36; ; k += 36){int t;if (k <= bias) t = 1;else if (k >= bias + 26) t = 26;else t = k - bias;if (q < t) break;output.Append((char)Digit2Codepoint(t + (q - t) % (36 - t)));q = (q - t) / (36 - t);}output.Append((char)Digit2Codepoint(q));bias = Adapt(delta, h + 1, h == b);delta = 0;h++;}}delta++;n++;}return output.ToString();}public static string Decode(string input){int n = 0x80;int i = 0;int bias = 72;StringBuilder output = new StringBuilder();int d = input.LastIndexOf('-');if (d > 0){for (int j = 0; j < d; j++){char c = input[j];if (c >= 0x80) throw new Exception();output.Append(c);}d++;}else d = 0;while (d < input.Length){int oldi = i;int w = 1;for (int k = 36; ; k += 36){if (d == input.Length) throw new Exception();int c = input[d++];int digit = Codepoint2Digit(c);if (digit > (int.MaxValue - i) / w) throw new Exception();i += digit * w;int t;if (k <= bias) t = 1;else if (k >= bias + 26) t = 26;else t = k - bias;if (digit < t) break;w *= 36 - t;}bias = Adapt(i - oldi, output.Length + 1, oldi == 0);if (i / (output.Length + 1) > int.MaxValue - n) throw new Exception();n += i / (output.Length + 1);i %= output.Length + 1;output.Insert(i, (char)n);i++;}return output.ToString();}private static int Adapt(int delta, int numpoints, bool first){delta /= first ? 700 : 2;delta += delta / numpoints;int k = 0;while (delta > 455){delta /= 35;k += 36;}return k + (36 * delta) / (delta + 38);}private static int Digit2Codepoint(int d){if (d < 26) return d + 97;if (d < 36) return d + 22;throw new Exception();}private static int Codepoint2Digit(int c){if (c < 58) return c - 22;if (c < 123) return c - 97;throw new Exception();}
}

在这里插入图片描述

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

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

相关文章

Docker:容器化技术的革命力量

Docker&#xff1a;容器化技术的革命力量 在当今的软件开发和部署领域&#xff0c;Docker 无疑是一颗璀璨的明星。它以其独特的魅力和强大的功能&#xff0c;改变了我们构建、交付和运行应用程序的方式。本文将深入探讨 Docker 的方方面面&#xff0c;带你领略它的魅力所在。 …

c语言链表实现

&#xff08;注意事项都已经在代码中标注&#xff09; 1.链表相关函数的头文件 #define _CRT_SECURE_NO_WARNINGS #pragma once #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <errno.h> #include <string.h> typede…

vscode写markdown插入图片视频并放在指定目录

目录 前言正文 前言 各种云文档非常好用&#xff0c;但是当你想把这些资料保存在本地时&#xff0c;markdown我觉得是最好的选择 markdown编辑器也有很多&#xff0c;但我还是觉得vscode最好用&#xff0c;直接粘贴文件就可以插入也类似云文档的使用体验&#xff0c;但是想要…

外卖点餐系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;外卖员管理&#xff0c;餐厅管理&#xff0c;用户管理&#xff0c;菜品分类管理&#xff0c;菜品信息管理&#xff0c;外卖订单管理&#xff0c;订单配送管理 微信端账号功能包括&#xff1a;系统首页…

OKHTTP 如何处理请求超时和重连机制

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

Linux下Docker方式Jenkins安装和配置

一、下载&安装 Jenkins官方Docker仓库地址&#xff1a;https://hub.docker.com/r/jenkins/jenkins 从官网上可以看到&#xff0c;当前最新的稳定版本是 jenkins/jenkins:lts-jdk17。建议下在新的&#xff0c;后面依赖下不来 所以&#xff0c;我们这里&#xff0c;执行doc…

VS+QT 自定义插件变成动态库加载及使用

一、前言 有个界面需要重复使用某个自定义的控件&#xff0c;希望自定义控件能够像动态库文件那样&#xff0c;添加引用lib就能使用&#xff0c;经过多次太坑后&#xff0c;总结如下 二、实现方式 ① 新建项目&#xff0c;选择"Qt Designer Custom Widget" 创建自定…

Kubernetes(k8s) 与 docker 间 镜像导入

docker 导出&#xff0c;k8s 导入 docker 镜像导出 查看镜像 docker images结果 REPOSITORY TAG IMAGE ID CREATED SIZE openjdk jz23 092ed76962fb 3 hours ago 694MB导出镜…

python爬虫 - 进阶正则表达式

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配中文 &#xff08;一&#xff09;匹配单个中文字符 &#xff08;二…

JavaEE-进程与线程

1.进程 1.1什么是进程 每个应⽤程序运⾏于现代操作系统之上时&#xff0c;操作系统会提供⼀种抽象&#xff0c;好像系统上只有这个程序在运 ⾏&#xff0c;所有的硬件资源都被这个程序在使⽤。这种假象是通过抽象了⼀个进程的概念来完成的&#xff0c;进程可 以说是计算机科学…

【动态规划】子数组系列(上)

1. 最大子数组和 53. 最大子数组和 状态表示&#xff1a;以 i 位置为结尾时的所有子数组中的最大和 状态转移方程&#xff1a; i 位置为结尾的子数组又可以分为长度为 1 的和大于 1 的&#xff0c;长度为 1 就是 nums[i] &#xff0c;长度不为 1 就是 dp[i - 1] nums[i]&…

Javascript笔试题目(三)

1.如何使用JS实现setTimeout功能来模拟setlnterva请写出具体代码 在JavaScript中&#xff0c;setTimeout 和 setInterval 是两个常用的定时器函数&#xff0c;但它们的行为有所不同。setTimeout 用于在指定的延迟后执行一次代码&#xff0c;而 setInterval 则用于每隔指定的时…

Ubuntu中vscode如何选择ROS版本

Ubuntu中可能安装了多个ROS版本&#xff0c;比如ROS1 noetic&#xff0c; ROS2 foxy, humble等。有时候需要在vscode中对ROS程序进行debug&#xff0c;一般会先安装ROS插件。当电脑上有多个ROS版本时&#xff0c;选择Debug中选择ROS&#xff1a;Launch ROS:Attach(ROS1)或者ROS…

Prometheus + Grafana 监控 MySQL 数据库

文章目录 1、前置介绍2、搭建流程2.1、安装 Docker2.2、安装 MySQL2.3、安装 MySQL Exporter2.4、安装 Prometheus2.5、安装 Grafana 1、前置介绍 本次监控平台搭建&#xff0c;我使用2台阿里云服务器来完成本次的搭建部署操作&#xff0c;配置如下&#xff1a; 阿里云ECS1&am…

【宝可梦】游戏

pokemmo https://pokemmo.com/zh/ 写在最后&#xff1a;若本文章对您有帮助&#xff0c;请点个赞啦 ٩(๑•̀ω•́๑)۶

Word文档功能快捷键大全

以下是 Microsoft Word 的全面快捷键大全&#xff0c;涵盖了文档操作、文本编辑、格式化、导航等多种功能&#xff0c;帮助你提高工作效率。 Word 全面快捷键和快捷方式表 功能类别快捷键/快捷方式功能描述基本文档操作Ctrl N新建文档Ctrl O打开文档Ctrl S保存文档F12另存…

AI金融攻防赛:金融场景凭证篡改检测(DataWhale组队学习)

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何解决 金融场景凭证篡改检测的核心问题&#xff0c;以及解决思路和代码实现过程。希望…

48 Redis

48 Redis 前言 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务。是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 redis会周期性的把更新的数据写入磁盘或者把修改操…

[C++][第三方库][RabbitMq]详细讲解

目录 1.介绍2.安装1.RabbitMq2.客户端库 3.AMQP-CPP 简单使用1.介绍2.使用 4.类与接口1.Channel2.ev 5.使用1.publish.cc2.consume.cc3.makefile 1.介绍 RabbitMQ&#xff1a;消息队列组件&#xff0c;实现两个客户端主机之间消息传输的功能(发布&订阅)核心概念&#xff1…

网络受限情况下安装openpyxl模块提示缺少Jdcal,et_xmlfile

1.工作需要处理关于Excel文件内容的东西 2.用公司提供的openpyxl模块总是提示缺少jdcal文件,因为网络管控,又没办法直接使用命令下载&#xff0c;所以网上找了资源&#xff0c;下载好后上传到个人资源里了 资源路径 openpyxl jdcal et_xmlfile 以上模块来源于&#xff1a;Py…