基于RFC 3151的Public ID转URN:Java工具及简化实现问询
关于RFC 3151公共ID转URN的Java实现问题
一、Java标准库的支持情况
Java标准库没有直接提供实现RFC 3151规范的公共ID到URN转换的工具类,不存在类似Translator.toUrn(...)的现成方法。
二、复用现有API降低实现复杂度
如果需要实现该转换,可以复用Java现有API来简化开发,核心思路和实现方式如下:
1. 转换规则拆解
根据RFC 3151的要求,转换主要包含三个核心步骤:
- 替换分隔符:将公共ID中的
//替换为: - 空格替换:将公共ID中的空格替换为
+ - 特殊字符编码:对规则定义的特殊字符(如
;、?、@等)进行百分号编码 - 拼接前缀:最终添加
urn:publicid:前缀
2. 复用Java内置编码工具
对于百分号编码的部分,可以直接复用java.net.URLEncoder类,它已经实现了标准的URL编码逻辑,正好符合RFC 3151对特殊字符的编码要求。
示例实现代码:
import java.net.URLEncoder; import java.nio.charset.StandardCharsets; public class PublicIdConverter { public static String toUrn(String publicId) { // 替换//为: String processed = publicId.replace("//", ":"); try { // 编码特殊字符,URLEncoder会自动将空格转为+,符合要求 String encoded = URLEncoder.encode(processed, StandardCharsets.UTF_8.name()); // 拼接URN前缀 return "urn:publicid:" + encoded; } catch (Exception e) { // UTF-8为标准编码,不会触发异常,此处仅做容错处理 throw new IllegalArgumentException("Invalid public ID format", e); } } // 测试示例 public static void main(String[] args) { String publicId = "-//OASIS//DTD DocBook XML V4.1.2//EN"; String urn = toUrn(publicId); // 输出结果:urn:publicid:-:OASIS:DTD+DocBook+XML+V4.1.2:EN System.out.println(urn); } }
3. 进阶优化(可选)
如果需要更精准地控制编码范围(仅编码RFC 3151指定的特殊字符),可以使用java.net.URI类的构造逻辑,或者引入Apache Commons Codec库的UrlCodec类,自定义允许的字符集,进一步缩小编码范围。
内容的提问来源于stack exchange,提问作者Olivier Cailloux
相关产品推荐
相关产品推荐

