<?xml version="1.0" standalone="yes"?>
<rss version="2.0">
  <channel>
    <title><![CDATA[XOYOZO RSS]]></title>
    <link><![CDATA[https://xoyozo.net]]></link>
    <description><![CDATA[XOYOZO RSS]]></description>
    <item>
      <title><![CDATA[clawhub 安装技能报错：Rate limit exceeded]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/clawhub-rate-limit-exceeded]]></link>
      <description><![CDATA[<p><font color="#071437" face="Inter, Helvetica, sans-serif"><span style="font-size: 13px; background-color: rgb(255, 255, 255);">安装技能时</span></font></p><pre class="brush:ps;toolbar:false">clawhub&nbsp;install&nbsp;xxx</pre><p><span style="background-color: rgb(255, 255, 255); color: rgb(7, 20, 55); font-family: Inter, Helvetica, sans-serif; font-size: 13px;">报错：</span></p><pre class="brush:plain;toolbar:false">Rate&nbsp;limit&nbsp;exceeded</pre><p><span style="background-color: rgb(255, 255, 255); color: rgb(7, 20, 55); font-family: Inter, Helvetica, sans-serif; font-size: 13px;">原因：</span></p><p><strong><span style="color: rgb(7, 20, 55); font-family: Inter, Helvetica, sans-serif; font-size: 13px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);">未登录</span></strong></p><p><span style="color: rgb(7, 20, 55); font-family: Inter, Helvetica, sans-serif; font-size: 13px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);">需要先执行：</span></p><pre class="brush:ps;toolbar:false">clawhub&nbsp;login</pre><p><span style="color: rgb(7, 20, 55); font-family: Inter, Helvetica, sans-serif; font-size: 13px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);"></span><br/></p>]]></description>
      <pubDate>Thu, 12 Mar 2026 08:51:12 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[clawhub login 遇到 Missing state.]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/clawhub-login-missing-state]]></link>
      <description><![CDATA[<p>明明已登录 clawhub.ai 网站，但是 clawhub login 的时候仍然提示：<br/></p><p><span style="text-wrap-mode: nowrap;">CLI login</span></p><p><span style="text-wrap-mode: nowrap;">Missing state.</span></p><p><span style="text-wrap-mode: nowrap;">Run the CLI again to start a fresh login.</span></p><p><br/></p><p>解决办法：</p><p>把 PowerShell 中的那个网址复制出来，在浏览器上打开即可。网址格式类似：</p><pre class="brush:plain;toolbar:false">https://clawhub.ai/cli/auth?redirect_uri=http%3A%2F%2F127.0.0.1%3A64172%2Fcallback&amp;label_b64=******&amp;state=******</pre><p><br/></p>]]></description>
      <pubDate>Thu, 12 Mar 2026 08:45:50 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[OpenClaw 和企业微信插件接入]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/wecom-openclaw-plugin]]></link>
      <description><![CDATA[<p>我来为你整理 Windows 本地部署 OpenClaw 并通过长连接方式接入企业微信的完整步骤：</p><h1>前置条件</h1><ul class=" list-paddingleft-2" style="list-style-type: disc;"><li><p>已安装企业微信最新版客户端</p></li><li><p>已安装 OpenClaw（Node.js 版本需 ≥ 22.0）</p></li><li><p><strong>管理员权限</strong>的企业微信账号（否则看不到 API 模式选项）</p></li></ul><h2>第一步：在企业微信创建长连接机器人</h2><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>打开企业微信客户端 → 工作台 → 智能机器人 → 创建机器人</p></li><li><p>点击底部小字 &quot;如需使用自有系统获取成员与机器人的聊天并输出回复，可切换至 API 模式创建&quot;</p></li><li><p>选择 「长连接」 方式（不要选 Webhook 回调模式）</p></li><li><p>复制保存生成的 Bot ID 和 Secret（后续需要用到）</p></li><li><p>先不要点击保存，保持页面打开，等完成 OpenClaw 配对后再保存&nbsp;</p></li></ol><h2>第二步：Windows 本地安装企微插件</h2><p>打开 PowerShell 或 命令提示符，依次执行以下命令：</p><h3>1. 安装企业微信插件</h3><pre class="brush:ps;toolbar:false">openclaw&nbsp;plugins&nbsp;install&nbsp;@wecom/wecom-openclaw-plugin</pre><p>如果安装失败，可尝试备用命令： openclaw plugins install @tencent/openclaw-wecom</p><h3>2. 重启 OpenClaw 网关</h3><pre class="brush:ps;toolbar:false">openclaw&nbsp;gateway&nbsp;start</pre><p>重要：这个窗口不能关闭，关闭后机器人会掉线。需要再新开一个终端窗口执行后续命令。</p><h3>3. 添加企业微信渠道</h3><p>在新开的终端窗口执行：</p><pre class="brush:ps;toolbar:false">openclaw&nbsp;channels&nbsp;add</pre><p>按提示操作：</p><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>用方向键选择 企业微信(WeCom) → 回车</p></li><li><p>粘贴输入 Bot ID → 回车</p></li><li><p>粘贴输入 Secret → 回车</p></li><li><p>选择 Finished/Done 完成基础配置</p></li><li><p>配对方式选择 Pairing</p></li></ol><h2>第三步：完成配对授权</h2><p>1. 回到企业微信，找到刚创建的机器人，发送任意消息（如&quot;你好&quot;）</p><p>2. 机器人会自动回复一条配对码消息（包含授权命令）</p><p>3. 复制消息最后一行的配对码</p><p>4. 在终端中执行配对命令：</p><pre class="brush:ps;toolbar:false">openclaw&nbsp;pairing&nbsp;approve&nbsp;openclaw-wecom&nbsp;你的配对码</pre><p>5. 提示&quot;授权成功&quot;即完成配对</p><h2>第四步：保存并启用机器人</h2><p>1. 回到企业微信机器人配置页面，点击 保存并创建</p><p>2. 现在可以在企业微信中与机器人正常对话了</p><h1>长连接 vs 回调模式的优势</h1><table class="table table-bordered align-middle table-sticky"><tbody><tr class="firstRow"><th>特性</th><th>长连接模式</th><th>传统回调模式</th></tr><tr><td>公网IP/域名</td><td>❌不需要</td><td>✅必须需要</td></tr><tr><td>内网穿透</td><td>❌不需要</td><td>✅必须配置</td></tr><tr><td>消息加解密</td><td>❌无需处理</td><td>✅需要处理</td></tr><tr><td>稳定性</td><td>高（无回调失败问题）</td><td>低（经常回调失败）</td></tr><tr><td>主动推送<br/></td><td>✅支持</td><td>✅支持</td></tr></tbody></table><h1>常见问题</h1><table class="table table-bordered align-middle table-sticky"><tbody><tr class="firstRow"><th>问题</th><th>解决方案</th></tr><tr><td>没有 API 模式选项</td><td>确认你是企业微信管理员，普通成员看不到该选项</td></tr><tr><td>插件安装失败</td><td>检查网络连接，或尝试切换 npm 镜像源： npm config set registry https://registry.npmmirror.com/</td></tr><tr><td>配对码无法获取</td><td>确认选择了 API 模式和长连接，重启 OpenClaw 后重试</td></tr><tr><td>机器人不回复</td><td>检查网关窗口是否保持运行，重新执行配对命令</td></tr><tr><td>需要 7×24 小时在线</td><td>建议部署到云服务器，本地关机后机器人会离线</td></tr></tbody></table><h1>命令速查表</h1><pre class="brush:ps;toolbar:false">#&nbsp;安装插件
openclaw&nbsp;plugins&nbsp;install&nbsp;@wecom/wecom-openclaw-plugin

#&nbsp;启动网关（窗口不能关）
openclaw&nbsp;gateway&nbsp;start

#&nbsp;添加渠道
openclaw&nbsp;channels&nbsp;add

#&nbsp;配对授权
openclaw&nbsp;pairing&nbsp;approve&nbsp;openclaw-wecom&nbsp;【配对码】

#&nbsp;重启服务
openclaw&nbsp;gateway&nbsp;restart

#&nbsp;查看状态
openclaw&nbsp;channels&nbsp;status</pre><p>配置完成后，你就可以在企业微信中与 OpenClaw 对话了。如果需要让个人微信也能使用，可以在企业微信后台 &quot;我的企业&quot; → &quot;微信插件&quot; 中生成二维码，用个人微信扫码关注企业即可。</p>]]></description>
      <pubDate>Thu, 12 Mar 2026 04:55:17 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[不买高防 IP，照样抵挡攻击（域名篇）]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/aliyun-ddos-without-bgp-domain]]></link>
      <description><![CDATA[<p>前面写过一篇文章介绍了<a href="https://xoyozo.net/Blog/Details/aliyun-ddos-without-bgp" target="_self">不买高防 IP，照样抵挡 DDoS 攻击（IP 篇）</a>，如果攻击的是域名（CC），那么...</p><p><br/></p><p>本文适用场景：攻击的是 web 网址而非 IP，来源有许多各地的 IP 地址，每个 IP 地址每小时只有若干请求，但整个网站每分钟有数万请求量。</p><p><br/></p><p>《小白鼠A》（贵）</p><p>阿里云有一款产品叫“<strong>Web 应用防火墙</strong>”，开通并接入云产品，试用按量付费即可。</p><p>在防护配置-Web核心防护 中可配置各种规则，譬如：</p><p>“自定义规则”可添加网址/UA/IP/Cookie/等中包含某些关键词的请求；</p><p>“区域封禁”可按地区来限制请求；</p><p>另外还有“CC防护”等各种实用规则。<br/></p><p>添加规则后记得关联实例。</p><p>配置完成后可在总览页面查看请求情况，如果攻击停止可关闭防火墙。</p><p>试用了12小时，平均每分钟请求2-5万次，消耗 15000SeCU，费用大概是750元。</p><p><br/></p><p>《小白鼠B》（推荐）</p><p>阿里云有一款产品叫“<strong>边缘安全加速 ESA</strong>”，开通接入域名（注意填写域名时不要写 www）。</p><p>创建购买成功后会有一个 CNAME 域名，解析生效。配置 HTTPS 证书。</p><p>打开“我正在遭受攻击”，开启后站点进入严格防护模式，默认对所有 HTTP 请求做滑块挑战。这是非常能节省费用的操作，实测开启与不开启的数量相差20倍（具体视攻击强弱）。</p><p>另外，ESA 自带的“安全防护-WAF”中若想根据 URL 中包含某个关键词来拒绝请求，需要升级套餐。可以直接在“规则-重定向”设置 302 跳转也能达到类似的效果，但是节省流量的最好办法还是开启滑块。</p><p>费用的话，大部费用是由“客户端请求到边缘加速服务器的流量”和“边缘加速服务器响应给客户端的流量”组成的，而且滑块页面不计入流量。可免费试用。</p><p>在开启滑块的情况下，1分钟产生10M流量，基础版包含的50GB可以用3天。<span style="text-wrap-mode: wrap;">标准版（500GB）375元可以用一个月。</span>（以我站实测为例，各站情况不同）。</p><p>具体费用在“计费管理-套餐管理-套餐总量 (月)-<img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260129/6390528700991145641713440.png" title="image.png" alt="image.png"/>”查看。<span style="text-wrap-mode: wrap;">超过套餐的流量会使用CDN流量包抵扣。</span></p><p>ECS 获取客户端 IP 的问题有两种解决方案，1. 设置<a href="https://help.aliyun.com/zh/edge-security-acceleration/esa/user-guide/nginx-obtains-the-real-ip-address-of-the-client?spm=a2c4g.11186623.help-menu-2673927.d_2_8_3_0_1.2910ee82mdFgeO" target="_blank">四层代理分析</a>（企业版），2. 设置重定向规则，重定向到直接解析到该网站的另一个域名。</p><p><strong>为了尽量减少滑块对用户体验的影响，建议加白名单：ESA-站点-安全防护-WAF-白名单规则，譬如添加省份规则，跳过全部规则（包括滑块）。</strong></p><p>其它问题：滑块会拒绝蜘蛛？</p><p>其它相似产品：Cloudflare、腾讯云 EdgeOne。</p><p><br/></p><p><span style="text-wrap-mode: wrap;">----------------</span>下面是停站维护时显示临时页面的做法----------------</p><p>被攻击期借用阿里云 OSS/CDN 显示“维护中”页面的方法。</p><p>1.</p><p>首先让 AI 快速生成一个维护中的页面，上传到 OSS。</p><p>虽然这个文件有一个对应的 CDN 链接，但是域名解析使用“显性 URL”模式并不能正常访问到这个页面。</p><p>2.</p><p>在阿里云 CDN 添加一个域名（也就是网站域名），会生成一个 CNAME 域名，网站域名 CNAME 到这个域名上。</p><p>配置这个 CDN 域名的 OSS 实例、HTTPS 等信息。</p><p>这样生效后，访问网站域名就能请求到这个 OSS 上了。</p><p>3.</p><p>但是它并不像网站一样有默认文档，需要添加重写规则。</p><p>打开 CDN-域名管理-缓存配置-重写访问URL，添加，添加重写规则。</p><p>例：如果目标页面路径是&nbsp;https://域名/index.html，那么重写规则就是：</p><pre class="brush:plain;toolbar:false">^/(?!.*index\.html$).*$</pre><p>也就是把所有除 /index.html 以外的路径全部重写到 /index.html。<br/></p><p>4.</p><p>下一步只要观察这个域名的实时流量和带宽，如果攻击停止了，将域名解析回 ECS。</p><p>CDN-统计分析-实时监控-访问数据-选择域名-查询。<br/></p>]]></description>
      <pubDate>Wed, 28 Jan 2026 05:58:28 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[nginx 配置文件中如何写两个条件“且”的关系？]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/nginx-config-and]]></link>
      <description><![CDATA[<p>nginx 配置文件中不能随意嵌套 if，而且 if 中也没有 and 和 or 逻辑，不过可以借用变量来实现：<br/></p><pre class="brush:plain;toolbar:false">set&nbsp;$a&nbsp;&quot;&quot;;
if&nbsp;($request_uri&nbsp;~*&nbsp;&quot;action=postreview&quot;)&nbsp;
{
&nbsp;&nbsp;&nbsp;set&nbsp;$a&nbsp;&quot;${a}1&quot;;
}
if&nbsp;($http_referer&nbsp;!~*&nbsp;&quot;^https?://([^/]+\.)?domains\.com([:/?#]|$)&quot;)&nbsp;
{
&nbsp;&nbsp;&nbsp;set&nbsp;$a&nbsp;&quot;${a}1&quot;;&nbsp;
}
if&nbsp;($a&nbsp;=&nbsp;&#39;11&#39;)
{
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;403;
}

fastcgi...</pre><p>上例中实现了 url 中包含&nbsp;action=postreview 且来源不是本站的情况拒绝访问。</p><p>一般放在&nbsp;fastcgi 所在 location，譬如宝塔面板的&nbsp;enable-php-xx.conf 文件中。</p>]]></description>
      <pubDate>Thu, 22 Jan 2026 07:29:36 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[写一句 MySQL 语句，优化和修复所有表]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/mysql-repair-optimize-all-databases]]></link>
      <description><![CDATA[<p>在MySQL中，没有单条SQL语句能直接优化和修复所有表。不过，有以下两种常用方法可以实现这个需求：</p><p>1. 使用MySQL命令行工具:</p><pre class="brush:ps;toolbar:false">mysqlcheck&nbsp;-u&nbsp;root&nbsp;-p&nbsp;--auto-repair&nbsp;--optimize&nbsp;--all-databases</pre><p>这条命令会提示输入密码，然后自动修复并优化所有数据库中的所有表。</p><p>2. 如果确实需要在MySQL客户端内执行，可以生成批处理语句：</p><pre class="brush:sql;toolbar:false">SELECT&nbsp;CONCAT(&#39;OPTIMIZE&nbsp;TABLE&nbsp;&#39;,&nbsp;table_schema,&nbsp;&#39;.&#39;,&nbsp;table_name,&nbsp;&#39;;&nbsp;REPAIR&nbsp;TABLE&nbsp;&#39;,&nbsp;table_schema,&nbsp;&#39;.&#39;,&nbsp;table_name,&nbsp;&#39;;&#39;)&nbsp;
FROM&nbsp;information_schema.tables&nbsp;
WHERE&nbsp;table_schema&nbsp;NOT&nbsp;IN&nbsp;(&#39;information_schema&#39;,&#39;mysql&#39;,&#39;performance_schema&#39;,&#39;sys&#39;);</pre><p>执行此查询后，复制结果中的所有语句再执行。</p><p>注意：执行表优化和修复操作需要相应权限，且在高负载生产环境中应谨慎操作，最好在低峰期进行。</p>]]></description>
      <pubDate>Thu, 22 Jan 2026 07:25:35 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[ASP.NET 网站发布到 IIS 报错，如何查看错误详情？]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/how-to-view-aspnet-error]]></link>
      <description><![CDATA[<p>方法一：打开 事件查看器-&gt; Windows 日志-&gt; 应用程序。</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20251223/6390207632513014062631522.png" title="QQ20251223-081955.png" alt="QQ20251223-081955.png"/></p><p><br/></p><p>方法二：启用ASP.NET Core Module Stdout 日志。</p><p>修改网站根目录下的 web.config 文件，在 &lt;aspNetCore&gt; 节点中启用标准输出日志。你需要先手动创建 logs 文件夹并确保有写入权限。</p><pre class="brush:xml;toolbar:false">&lt;aspNetCore&nbsp;processPath=&quot;dotnet&quot;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arguments=&quot;.\YourAppName.dll&quot;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stdoutLogEnabled=&quot;true&quot;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stdoutLogFile=&quot;.\logs\stdout&quot;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hostingModel=&quot;inprocess&quot;&nbsp;/&gt;</pre><p>重现错误后，即可在 logs 目录下查看生成的日志文件。注意：出于性能考虑，问题解决后建议将 stdoutLogEnabled 设为 false。</p>]]></description>
      <pubDate>Tue, 23 Dec 2025 00:47:02 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Lucene.Net 的 Document 字段类型]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/lucene-net-document]]></link>
      <description><![CDATA[<table class="table table-bordered align-middle table-sticky"><thead><tr class="firstRow"><th><p>字段类型</p></th><th><p>是否分词 (Analyzed)</p></th><th><p>是否索引 (Indexed)</p></th><th><p>是否存储 (Stored)</p></th><th><p>适用场景</p></th></tr></thead><tbody><tr><td><p><strong>Int32Field</strong></p><p><strong>Int64Field</strong></p></td><td>否</td><td>是</td><td>由&nbsp;<code class="hyc-common-markdown__code__inline">Store</code>参数决定</td><td>时间戳、数值等需要<strong>范围查询</strong>的字段</td></tr><tr><td><p><strong>StringField</strong></p></td><td><p>否</p></td><td><p>是</p></td><td><p>由 <code class="hyc-common-markdown__code__inline">Store</code>参数决定</p></td><td><p>订单号、身份证号、URL等需要<strong>精确匹配</strong>的字段</p></td></tr><tr><td><p><strong>TextField</strong></p></td><td><p>是</p></td><td><p>是</p></td><td><p>由 <code class="hyc-common-markdown__code__inline">Store</code>参数决定</p></td><td><p>文章标题、正文、描述等需要<strong>全文搜索</strong>的字段</p></td></tr><tr><td><p><strong>StoredField</strong></p></td><td><p>否</p></td><td><p>否</p></td><td><p>是</p></td><td><p>仅用于存储，不参与搜索（如图片路径、文件等二进制数据）</p></td></tr></tbody></table><p><br/></p>]]></description>
      <pubDate>Tue, 16 Dec 2025 08:49:04 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Alibaba Cloud Linux 不显示中文]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/alibaba-cloud-linux-display-chinese-error]]></link>
      <description><![CDATA[<p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20251212/6390115476883697897426842.png" title="image.png" alt="image.png"/></p><p>中文显示小方块，原因是你使用了 VNC 登录，改用 Workbench 或 SSH 工具则正常显示。</p>]]></description>
      <pubDate>Fri, 12 Dec 2025 08:48:19 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[跨平台签名验证场景中的 URL 编码]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/url-encoding-in-cross-platform-signature-verification]]></link>
      <description><![CDATA[<p>今天发现在 .NET Framework 和 .NET 9 中使用&nbsp;System.Uri.EscapeDataString() 方法对字符串进行编码，会产生不同的结果。</p><p>譬如“(”符号，前者视其为非保留字符，不进行转义，后者视为保留字符，转义为“%28”。</p><p>原因是&nbsp;.NET Framework 4.8 主要遵循&nbsp;RFC 2396，而 .NET 9&nbsp;遵循 RFC 3986。</p><p><br/></p><p>在跨平台签名验证场景中，对 URL 编码的一致性要求极高，任何细微差别都会导致签名校验失败。</p><p>以下是以 RFC 3986 标准为核心、优先使用各平台内置的高一致性方案。</p><p><br/></p><p><strong>对于 .NET 9</strong>，直接使用&nbsp;Uri.EscapeDataString()。</p><pre class="brush:c#;toolbar:false">string&nbsp;encodedData&nbsp;=&nbsp;System.Uri.EscapeDataString(dataToEncode);</pre><p><br/></p><p><strong>对于&nbsp;.NET Framework</strong>，以下是一个遵循 RFC 3986 严格标准的自定义编码方法示例。</p><pre class="brush:c#;toolbar:false">static&nbsp;string&nbsp;Rfc3986EscapeDataString(string&nbsp;input)
{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;定义&nbsp;RFC&nbsp;3986&nbsp;中明确的未保留字符集（不编码）
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;unreservedChars&nbsp;=&nbsp;&quot;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~&quot;;

&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;result&nbsp;=&nbsp;new&nbsp;StringBuilder();
&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;data&nbsp;=&nbsp;Encoding.UTF8.GetBytes(input);&nbsp;//&nbsp;统一转换为&nbsp;UTF-8&nbsp;字节

&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(byte&nbsp;b&nbsp;in&nbsp;data)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;currentChar&nbsp;=&nbsp;(char)b;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果是未保留字符，直接输出
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(unreservedChars.IndexOf(currentChar)&nbsp;!=&nbsp;-1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.Append(currentChar);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;否则，进行百分号编码（%XX，大写）
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.Append(&#39;%&#39;).Append(b.ToString(&quot;X2&quot;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result.ToString();
}</pre><p><br/></p><p><strong>对于 PHP</strong>，直接使用内置的 <a href="https://www.php.net/manual/zh/function.rawurlencode.php" target="_blank">rawurlencode()</a> 函数。这个函数的设计初衷就是严格遵循 RFC 3986 标准。</p><pre class="brush:php;toolbar:false">$encoded_data&nbsp;=&nbsp;rawurlencode($data_to_encode);</pre><p><br/></p><p><strong>对于 JavaScript</strong>，encodeURIComponent 函数严格遵循 RFC 3986 标准。</p><pre class="brush:js;toolbar:false">let&nbsp;encodedData&nbsp;=&nbsp;encodeURIComponent(dataToEncode);</pre><p><br/></p><p>重要提示：无论使用哪种语言，务必在编码前明确指定字符串使用 UTF-8 编码。编码不一致是导致乱码和签名失败最常见的原因之一 。</p>]]></description>
      <pubDate>Tue, 09 Dec 2025 05:30:41 GMT</pubDate>
    </item>
  </channel>
</rss>