中文化和国际化问题权威解析之五:URL编码/Misc

本文深入探讨了字符集的概念,包括EBCDIC、OEM字符集、ANSI字符集和HZ编码等,并详细解析了URL编码的工作原理及浏览器、Web服务器如何处理中文等非ASCII字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过前面中文化、国际化问题解决的系列1-4,相信大家对字符集、字符编码、字符解码、字符乱码、Java中文问题解决等都有了一个比较清晰的认 识;但文中的信息并非包罗万象,结合到自己平时对于字符集、编码相关的一些疑惑,本篇对一些前文中并未提及的一些问题进行补充,以便让该系列更加完善和全 面;本文主要解决以下两个问题:其一,解决UltraEdit菜单中的 文件 -> 转换 子菜单中涉及的一些名词疑惑,主要涉及EBCDIC 、OEM字符集、ANSI字符集、HZ编码等;其二,补充关于URL编码相关的一些知识点,涉及浏览器、Web服务器设置、Servlet规范等;

更多的与字符集相关的专业词汇简介

相信很多同学都有在用UltraEdit这个文本编辑器软件,从菜单 文件--> 转换 进入即可看见很多的字符集间的转换子菜单,不同版本间可能会有些差异,可以参考下图:

从上图中我们可以看到很多前面已经提及的一些词汇,比如ASCII、Unicode [Big Endian/Little Endian]、UTF-8等;但还有一些未提及的,下面就逐个介绍下:

  • l DOS/UNIX/MAC 间的转换
    这几项和字符集无关,主要是由于各个系统对行结束字符的要求不一样,体现在:Mac格式只要求回车、Unix只要求换行、DOS则要求回车、换行 二者组合;这几个命令要做的就是对这几个特殊字符进行相应替换;
  • l EBCDIC (Extended Binary Coded Decimal Interchange Code):
    他 是与ASCII同时期的一种字符编码,主要用于IBM计算机中;它采用8位码, 有256个编码状态, 但只选用其中一部分。0-9十个数字符的高4位编码为1111, 低4位仍为0000-1001。大、小写英文字母的编码同样满足正常的排序要求, 而且有简单的对应关系, 即同一个字母的大小写的编码值仅最高的第二位的值不同, 易于识别与变换。
  • l OEM 字符集
    由于ASCII码只利用了低7位,第8位没有 被使用,而随着计算机的发展,很多原始设备制造商(当时最有名的应该就是IBM了)觉得ASCII码已经无法满足需求了,所以他们各自对第8位进行了自定 义扩展,从而形成了五花八门的OEM字符集;由于这些扩展都是不通用的,只有各自能够解释,这些不兼容的扩展又叫做代码页(Code Page),在同一台机器中,通过不同的代码页就可以实现系统间信息的转换了;
  • l ANSI 字符集
    正如前面提到的,众多的OEM厂商对第8位 进行了自定义扩展;但更加夸张和恐怖的事情是,随着计算机进入亚洲,此时却发现整整用完8位也无法将所有的他们需要的语言字符;于是在ASCII的基础上 他们再次进行了扩展,从而产生了双字节字符集DBCS(double byte character set),我们常见的国标系列GB2312/GBK/BIG5......都属于此类;这些字符集有一个共同的特点:完全兼容 ASCII !这是ANSI系列和Unicode系列最大的不同点;这类型基于ASCII码进行扩展的多字节字符集MBCS统称为ANSI字符集;注意:ANSI字符集之间也是无法直接识别的,需要进行自定义转换;
  • l 提到国标系列,在此我还想提一个编码:HZ ,HZ是汉字的简称?
    他 是基于GB字符集的一种简体中文编码,在新加坡被广泛使用;编码规则为:他将每个字节中的第8位(在GB字符集中该位为1)屏蔽,只保留低7位,并将经过 变换后的部分用~{、~}括起来;解码的时候只需要将括号对里面的部分高位还原成1即可;这样就可以在互联网上广泛的传输了,而不必受制于某些系统只能接 收基于ASCII码的字符;

URL编码

基于Java开发的Web应用URL组成如下:
http://domain:port/contextPath/servletPath/pathInfo?queryString
其中各个部分含义如下:
Domain、Port:分别是域名和端口;
contextPath:应用上下文路径,默认为应用名称,比如我们的apps;但可以通过应用服务器的相关配置进行修改,一般线上环境会修改成/,此时相当于contextPath为空;
servletPath:Servlet 路径,一般在应用的web.xml文件中配置servlet-mapping;但由于现在的web应用一般都会用一些框架,比如Struts、 Webwork等,此时各框架都会对此进行封装,会在另外的配置文件中进行设置;但原理都是一样的;
pathInfo:可以理解为最终接收用户请求的具体执行类,比如我们常说的Action;
queryString:get方式传入的请求参数;
以上各个部分中可能存在中文问题的是 pathInfo 、queryString 两个部分;

首先,我们来看下Servlet中和URL相关的一些api及其注意事项:
HttpServletRequest.setCharacterEncoding(); //仅仅只适用于设置post提交的request body的编码而不是设置get方法提交的queryString的编码。该方法还告诉应用服务器应该采用什么编码解析post传过来的内容;注意:若没 有设定characterEncoding,则使用ISO-8859-1来解码用户输入的表单,而不是使用系统默认的编码
HttpServletResponse.setContentType(); //告诉浏览器网页中数据是什么编码;表单提交时,根据ContentType指定的charset对表单中的数据编码,然后发送给服务器。
HttpServletRequest.getParameter("name"); //返回的字符串为:queryString(包括get和post),其值经过Servlet服务器URL Decode过的,默认编码来源于应用服务器中的配置,比如tomcat中server.xml的URIEncoding。
HttpServletRequest.getPathInfo(); //返回的字符串为:pathinfo;由Servlet服务器解码(decode)过的。默认编码同上,tomcat中可设置useBodyEncodingForURI。
HttpServletRequest.getRequestURI(); //返回的字符串为:contextPath/servletPath/pathinfo;注意是浏览器提交过来的原始数据,未被Servlet服务器URL Decode过。

对URL编码【URL Encoding/Percent Encoding 】时,使用以下规则:
字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。
特殊字符 "."、"-"、"*" 和 "_" 保持不变。
空格字符 " " 转换为一个加号 "+"。
所 有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含 3 个字符的字符串 "%xy" 表示,其中 xy 为该字节的两位十六进制表示形式。推荐的编码机制是 UTF-8。但是,出于兼容性考虑,如果未指定一种编码,则使用相应平台的默认编码。

假定我们待请求URL为:http://localhost:8080/example/ 中国?name=中国;
Html内content-type或meta中的charset=GBK ;文件格式为ANSI/ASCII;
URL中的两个汉字"中国"的各字符集下的编码为:

汉字编码二进制表示
中国UTF-80xe4 0xb8 0xad 0xe5 0x9b 0xbd[-28, -72, -83, -27, -101, -67]
中国GBK0xd6 0xd0 0xb9 0xfa[-42, -48, -71, -6]
中国ISO8859-10x3f 0x3f[63, 63][??]

对于Get方式的URL请求有两种情况,其一:用户直接在浏览器地址栏中输入URL,此时浏览器没有编码可参考,直接用浏览器的默认编码进行解析并 提交到服务端;其二:在form表单内提交,只是form属性method为GET,此时浏览器会参考目前html中对编码的相关设置进行解析,比如 content-type或meta中的charset。

以下就重点讲讲第二种方式的提交:
GET方式form submit:浏览器会对URL进行URL encoding,然后发送给服务器。

  • 对于中文IE,如果在高级选项中选中总以 UTF-8 发送 (默认方式),则PathInfo在URL Encoding时按照UTF-8编码;QueryString按照GBK编码。
    此时提交是:GET /example/%E4%B8%AD%E5%9B%BD?name=%D6%D0%B9%FA
  • 对于中文IE,如果在高级选项中取消总以 UTF-8 发送 ,则PathInfo和QueryString在URL encoding时按照GBK编码。
    此时提交是:GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA
  • 对于中文firefox、Chrome,因为没有类似IE中的这种设置选项,所以这两种浏览器中对pathInfo的编码规则没有做特殊处 理,MS是和queryString采取同样的编码规则;在本例中的假设情况下:pathInfo和queryString在URL encoding时都按照GBK编码。
    此时提交是:GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA

很显然,不同的浏览器以及同一浏览器的不同设置,会影响最终URL中PathInfo的编码,该编码可能不会由我们应用来控制;对于 queryString,则是可以由我们的应用来完全控制的,对于上面的事例:中文的IE和FIREFOX都是采用GBK编码queryString。

若调整下上例中的假设条件,设置Html内content-type或meta中的charset=UTF-8
此时在IE中queryString会按照UTF-8进行编码,即name=%E4%B8%AD%E5%9B%BD;
但是在非IE(Firefox、Chrome)中,此时提交时URL中会以中文直接提交,即name=中文;此时服务端的web服务器上肯定要进行相应的编码配置,否则肯定会出现乱码;

若设置Html内content-type或meta中的charset=ISO-5899-1
此时在IE、Firefox、Chrome中queryString都被用ISO-5899-1编码了,即name= %26%2320013%3B%26%2322269%3B;
对于编码串中的%26、%3B应该是百分号编码【Percent Encoding 】中的保留字符,分别对应&、;,两者之间是经过编码的十进制码;对于这点偶也不是十分肯定?要是有同学比较清楚,请告诉偶下,thx。

POST方式提交:表单中的参数值对是通过request body发送给服务器,此时浏览器会根据网页的ContentType("text/html; charset=GBK")中指定的编码进行对表单中的数据进行编码,然后发给服务器。
在服务器端的程序中我们可以通过Request.setCharacterEncoding() 设置编码,然后通过request.getParameter获得正确的数据。

小结:

  • 1. URL中的PathInfo字符串的编码和解码是由浏览器和应用服务器的配置决定的,我们的程序不能设置,不要期望用 request.setCharacterEncoding()方法能设置URL中pathInfo解码时的字符集,这在servlet规范里面有说明。
  • 2. URL中如果含有中文等非ASCII字符,则浏览器会对它们进行URLEncode。为了避免浏览器采用了我们不希望的编码,所以最好不要在URL中直接使用非ASCII字符,而采用URL Encode编码过的字符串%xy;
    对此建议URL:http://localhost:8080/example/%D6%D0%B9%FA?name=%D6%D0%B9%FA
  • 3. URL中PathInfo和QueryString应该采用相同的编码,pathInfo最好不要用中文;因为不同浏览器对URL中PathInfo和QueryString编码时采用的字符集不同,但应用服务器对URL通常会采用相同的字符集来解码。
  • 4. URL中的queryString的编码方式是依赖于网页的contentType、meta中的charset字符集设置的,记住这点对于form get方式提交乱码问题排查是非常有好处的。
  • 5. 页面文件的编码最好和页面内设置的charset一致,因为我们可能在页面内部有很多中文,若编码不一致,则可能出现在编辑器内看着是正常的,但到了浏览 器上则变成了乱码(虽然页面显示为乱码,但这并不意味着在form submit时数据会有问题,很可能出现负负为正的情况);这点在前面宝宝的文档中也有说明;
    另外,文件的编码很可能会影响问题的排查;比如上例中我们就已说明:文件格式为ANSI/ASCII,若文件格式为Unicode/UTF-*系列,那测试结果会不会不一样呢?大家可以自行测试下;
  • 6. 服务端URL Encode时最好指定字符集,否则encoding的字符集依赖于本地系统的默认编码。可以参考javadoc:
    http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/net/URLEncoder.html

相关文档参考:
字符,字节和编码:http://www.regexlab.com/zh/encoding.htm
各种字符集和编码详解:http://blog.youkuaiyun.com/ancky/archive/2008/01/11/2034809.aspx
深入浅出URL编码:http://blog.youkuaiyun.com/yzhz/archive/2007/07/03/1676796.aspx
javascript html 相关编码问题研究:http://stauren.net/log/fpev3c89q.html
J2EE Web组件中中文及相关的问题(系列):http://blog.youkuaiyun.com/whodsow/archive/2003/10/27/19465.aspx

Exception caught during install: Error processing 'src/exploration/pci_mav' : [src/exploration/pci_mav] Checkout of https://github.com/unr-arl/pci_mav version None into /home/ishtar/mbplanner_ws/src/exploration/pci_mav failed. Error processing 'src/mapping/volumetric_mapping' : [src/mapping/volumetric_mapping] Checkout of https://github.com/unr-arl/volumetric_mapping version gbp_dev into /home/ishtar/mbplanner_ws/src/mapping/volumetric_mapping failed. Error processing 'src/mapping/voxblox' : [src/mapping/voxblox] Checkout of https://github.com/ethz-asl/voxblox version feature/new_abort_criterion_for_fast_integrator into /home/ishtar/mbplanner_ws/src/mapping/voxblox failed. Error processing 'src/misc/catkin_simple' : [src/misc/catkin_simple] Checkout of https://github.com/catkin/catkin_simple version 0e62848b12da76c8cc58a1add42b4f894d1ac21e into /home/ishtar/mbplanner_ws/src/misc/catkin_simple failed. Error processing 'src/misc/eigen_catkin' : [src/misc/eigen_catkin] Checkout of https://github.com/ethz-asl/eigen_catkin version 00b5eb254bad8de9cd68d238aa994e443062cf30 into /home/ishtar/mbplanner_ws/src/misc/eigen_catkin failed. Error processing 'src/misc/eigen_checks' : [src/misc/eigen_checks] Checkout of https://github.com/ethz-asl/eigen_checks version 22a6247a3df11bc285d43d1a030f4e874a413997 into /home/ishtar/mbplanner_ws/src/misc/eigen_checks failed. Error processing 'src/misc/gflags_catkin' : [src/misc/gflags_catkin] Checkout of https://github.com/ethz-asl/gflags_catkin version 5324e74119996a6e2da12d20e5388c17480ebd79 into /home/ishtar/mbplanner_ws/src/misc/gflags_catkin failed. Error processing 'src/misc/minkindr' : [src/misc/minkindr] Checkout of https://github.com/ethz-asl/minkindr version bc4503c34970a13b7ef06f62505e3333395ce02c into /home/ishtar/mbplanner_ws/src/misc/minkindr failed. ERROR in config: Error processing 'src/exploration/pci_mav' : [src/exploration/pci_mav] Checkout of https://github.com/unr-arl/pci_mav version None into /home/ishtar/mbplanner_ws/src/exploration/pci_mav failed. Error processing 'src/mapping/volumetric_mapping' : [src/mapping/volumetric_mapping] Checkout of https://github.com/unr-arl/volumetric_mapping version gbp_dev into /home/ishtar/mbplanner_ws/src/mapping/volumetric_mapping failed. Error processing 'src/mapping/voxblox' : [src/mapping/voxblox] Checkout of https://github.com/ethz-asl/voxblox version feature/new_abort_criterion_for_fast_integrator into /home/ishtar/mbplanner_ws/src/mapping/voxblox failed. Error processing 'src/misc/catkin_simple' : [src/misc/catkin_simple] Checkout of https://github.com/catkin/catkin_simple version 0e62848b12da76c8cc58a1add42b4f894d1ac21e into /home/ishtar/mbplanner_ws/src/misc/catkin_simple failed. Error processing 'src/misc/eigen_catkin' : [src/misc/eigen_catkin] Checkout of https://github.com/ethz-asl/eigen_catkin version 00b5eb254bad8de9cd68d238aa994e443062cf30 into /home/ishtar/mbplanner_ws/src/misc/eigen_catkin failed. Error processing 'src/misc/eigen_checks' : [src/misc/eigen_checks] Checkout of https://github.com/ethz-asl/eigen_checks version 22a6247a3df11bc285d43d1a030f4e874a413997 into /home/ishtar/mbplanner_ws/src/misc/eigen_checks failed. Error processing 'src/misc/gflags_catkin' : [src/misc/gflags_catkin] Checkout of https://github.com/ethz-asl/gflags_catkin version 5324e74119996a6e2da12d20e5388c17480ebd79 into /home/ishtar/mbplanner_ws/src/misc/gflags_catkin failed. Error processing 'src/misc/minkindr' : [src/misc/minkindr] Checkout of https://github.com/ethz-asl/minkindr version bc4503c34970a13b7ef06f62505e3333395ce02c into /home/ishtar/mbplanner_ws/src/misc/minkindr failed. ishtar@ubuntu:~/mbplanner_ws$ 以上这些报错是否会影响我的进一步使用?
07-08
<think>根据你提供的错误信息,看起来是在使用`wstool`或其他类似工具(可能是`vcstool`)进行工作空间初始化或更新时,多个仓库的检出(checkout)失败了。这些错误通常发生在使用ROS(Robot Operating System)时,通过`rosinstall`文件管理源代码依赖项。 错误原因分析: 1. 每个错误都指出在检出特定版本(commit hash、分支名或标签)时失败。 2. 可能的原因包括: - 网络问题导致无法访问GitHub。 - 指定的版本(分支、标签或提交哈希)不存在。 - 仓库的URL有误或仓库已被移除/重命名。 - 权限问题(但如果是公开仓库,通常不需要权限)。 具体分析几个错误: - `pci_mav`: 版本为`None`,这可能是配置文件中没有指定版本,而默认分支可能不存在或无法获取。 - `volumetric_mapping`: 指定分支`gbp_dev`,可能该分支已不存在。 - `voxblox`: 指定分支`feature/new_abort_criterion_for_fast_integrator`,可能该分支已不存在。 - 其他几个仓库(如`catkin_simple`, `eigen_catkin`等)都指定了具体的提交哈希,这些提交哈希可能不存在(比如仓库历史被重写)或仓库地址有变化。 影响评估: 这些错误会导致相应的软件包没有成功下载到你的工作空间(`mbplanner_ws`)中。因此,当你尝试编译工作空间(使用`catkin_make`或`catkin build`)时,会因为这些依赖包缺失而失败。 解决方案: 1. 检查网络连接:确保可以访问GitHub(例如,尝试在浏览器中打开这些URL)。 2. 手动检查仓库的可用性: - 访问每个仓库的URL,确认是否存在。 - 检查指定的版本(分支、标签或提交)是否存在。 3. 如果仓库存在但指定的版本不存在,需要更新配置文件(通常是`.rosinstall`文件)中的版本信息。 4. 如果某些仓库已经迁移或URL改变,需要更新URL。 5. 也可以尝试使用`wstool update`或`vcstool`的更新命令,但可能还是需要先修复配置。 由于错误数量较多,手动修复可能比较繁琐。你可以尝试以下步骤: 步骤1:检查并更新配置 查看你的`.rosinstall`文件(可能在`mbplanner_ws`的`src`目录下),找到每个失败的条目,然后根据实际情况修改版本(分支、标签或提交)或URL。 例如,对于`volumetric_mapping`,原配置可能是: - git: {local-name: src/mapping/volumetric_mapping, uri: 'https://github.com/unr-arl/volumetric_mapping', version: 'gbp_dev'} 你可以尝试将`version`改为该仓库中存在的分支(如查看GitHub上该仓库的分支列表,可能`gbp_dev`已经不存在,可以尝试用`master`或其他分支)。 步骤2:重新运行安装命令 修改配置文件后,重新运行`wstool update`或`vcstool import`(取决于你使用的工具)来更新仓库。 步骤3:手动克隆缺失的仓库 如果某个仓库始终无法通过工具下载,你可以手动克隆: ```bash cd /home/ishtar/mbplanner_ws/src # 例如对于pci_mav git clone https://github.com/unr-arl/pci_mav.git exploration/pci_mav # 然后切换到所需的版本(如果有指定版本) cd exploration/pci_mav # 如果原配置版本为None,则使用默认分支(通常为master或main) # 如果配置指定了分支或标签,则切换: git checkout <branch/tag/commit> ``` 步骤4:如果某些仓库已经不存在或无法访问,你可能需要寻找替代方案,或者联系项目维护者。 注意:由于这些错误,你的工作空间是不完整的,因此编译使用肯定会受到影响。必须解决这些依赖问题才能继续。 如果上述步骤无法解决,请提供你的`.rosinstall`文件内容(或你使用的安装命令),以便进一步分析。 最后,关于是否影响使用:是的,这些错误会导致后续编译失败,因为缺少必要的源代码。因此,必须解决这些错误才能继续。 由于你是在ROS环境下工作,也可以尝试使用`rosdep`安装系统依赖,但这里的问题显然是源代码依赖,所以必须先解决。 希望这些步骤能帮助你解决问题。 §§相关问题§§: 1. 如何检查ROS工作空间中的依赖项是否完整? 2. 在ROS中,如何正确使用wstool或vcstool管理多个仓库? 3. 如果某个ROS依赖包无法从源代码安装,有哪些替代方案? 4. 如何调试catkin_make的编译错误?</think>根据你提供的错误信息,这些报错**会严重影响你的后续使用**。以下是详细分析解决方案: ### 问题分析 1. **核心问题**:所有错误都是Git仓库检出失败 - 多个依赖包未能成功下载到工作空间 - 涉及关键模块:路径规划(`pci_mav`)、地图构建(`volumetric_mapping`, `voxblox`)、基础库(`eigen_catkin`, `gflags`等) 2. **具体原因**: ```bash # 典型错误模式: Checkout of [URL] version [特定版本] into [本地路径] failed. ``` - 版本指定问题:`version None`(未指定版本)、`gbp_dev`(分支)、`feature/...`(特性分支) - 网络问题:GitHub连接不稳定或权限不足 - 仓库变更:指定版本可能已被删除或重命名 3. **影响范围**: - ✅ 不影响现有已编译的代码 - ❌ **无法进行新编译**(缺少关键依赖) - ❌ **无法更新代码库** - ❌ 功能模块将缺失(如地图构建、路径规划) --- ### 解决方案 #### 步骤1:验证网络连接 ```bash # 测试GitHub连通性 ping github.com curl -v https://github.com # 测试具体仓库访问(示例) git ls-remote https://github.com/unr-arl/pci_mav ``` #### 步骤2:手动克隆问题仓库 以`pci_mav`为例: ```bash cd ~/mbplanner_ws/src/exploration/ rm -rf pci_mav # 删除失败目录 git clone https://github.com/unr-arl/pci_mav.git # 无版本指定时使用默认分支 ``` #### 步骤3:指定正确版本 对于需要特定版本的仓库(如`volumetric_mapping`): ```bash cd ~/mbplanner_ws/src/mapping/ git clone https://github.com/unr-arl/volumetric_mapping.git cd volumetric_mapping # 检查可用分支 git branch -a # 切换到存在的分支(如无gbp_dev则用master/main) git checkout master ``` #### 步骤4:更新仓库配置 检查`mbplanner_ws`中的配置文件(可能是`.rosinstall`或`package.xml`),修正版本指定: ```xml <!-- 示例:修正volumetric_mapping版本 --> <depend type="git" url="https://github.com/unr-arl/volumetric_mapping" version="master"/> ``` #### 步骤5:完整修复流程 ```bash cd ~/mbplanner_ws # 1. 清除错误状态 rm -rf src/exploration/pci_mav rm -rf src/mapping/volumetric_mapping rm -rf src/mapping/voxblox rm -rf src/misc/* # 清除所有失败项 # 2. 手动克隆核心仓库 git clone https://github.com/unr-arl/pci_mav src/exploration/pci_mav git clone https://github.com/unr-arl/volumetric_mapping src/mapping/volumetric_mapping git clone https://github.com/ethz-asl/voxblox src/mapping/voxblox # 3. 重新初始化工作空间 catkin init catkin build # 尝试重新编译 ``` --- ### 关键注意事项 1. **版本回退**:如果特性分支不存在(如`voxblox`的`feature/new_abort...`),在仓库中执行: ```bash git checkout main # 或稳定版本标签 ``` 2. **权限问题**:若使用SSH URL,确保GitHub SSH密钥已配置: ```bash git remote set-url origin git@github.com:ethz-asl/voxblox.git ``` 3. **替代方案**:若某些仓库已弃用,需更新为替代包: ```bash # 在package.xml中替换依赖 <depend>volumetric_mapping</depend> → <depend>new_mapping_tool</depend> ``` --- ### 验证是否修复 成功修复的标志: ```bash cd ~/mbplanner_ws catkin build # 应看到: # [Build] Successfully built all packages! ``` 如果仍有报错,需具体分析缺失的依赖关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值