https://www.cnblogs.com/shihaiying/p/11759202.html 一、RFC3986文档规定: Url中只允许包含 英文字母(a-zA-Z)、 数字(0-9)、 4个特殊字符:-_.~、 以及所有保留字符(18个),即:!*'();:@&=+$,/?#[]。 二、保留字符 保留字符 18个,即:!*'();:@&=+$,/?#[]。 保留字符是 url 中有特定含义的字符,如: ://用于分隔协议和主机, /用于分隔主机和路径, ?用于分隔路径和查询参数, =用于表示查询参数中的键值对, &用于分隔查询多个键值对等等。 注意: 1.对于Url中的合法(允许包含的)字符,编码和不编码是等价的。 2.合法字符中的保留字符,RFC3986文档给规定了特定的含义, 如果出现,但不代表此含义时,需要编码! 三、需要编码的字符。 1.保留字符(需要编码的情况:如果在 url 中要出现保留字符,但其含义与保留字符规定的含义不同。) 2.不安全字符(空格、引号以及<>、#、%、{}|\^[]`~)。 3.其他字符(所有 url 允许包含之外的字符,比如:汉字等等) 四、Url编码。 通常也被称为百分号编码(Url Encoding,also known as percent-encoding), 是因为它的编码方式非常简单,使用%百分号加上两位的字符“0123456789ABCDEF”代表一个字节的十六进制形式。 Url编码默认使用的字符集是 US-ASCII。 例如,a 在US-ASCII码中对应的字节是0x61,那么Url编码之后得到的就是%61, 我们在地址栏上输入http://g.cn/search?q=%61%62%63,实际上就等同于在google上搜索abc了。 又如@符号 在ASCII字符集中对应的字节为0x40,经过Url编码之后得到的是%40。 注: 1)对于非ASCII字符,需要使用ASCII字符集的超集进行编码得到相应的字节(编号对应该字符), 然后对每个字节执行百分号编码。 如:一个汉字,需要三个字节来表示,如:你 -> %E4%BD%A0 2)如果某个字节对应着ASCII字符集中的某个非保留字符,则此字节无需使用百分号表示。 五、保留字符的 url 编码列表(18个),即:!*'();:@&=+$,/?#[]。: ! -> %21 # -> %23 $ -> %24 & -> %26 ' -> %27 ( -> %28 ) -> %29 * -> %2A + -> %2B , -> %2C / -> %2F : -> %3A ; -> %3B = -> %3D ? -> %3F @ -> %40 [ -> %5B ] -> %5D 六、其他常用字符: " -> %22 % -> %25 | -> %7C { -> %7B } -> %7D %0D%0A -> 回车、换行 英文空格 -> %20/+ 七、在 js 中,可以使用函数进行转换。 1、encodeURI() 2、decodeURI() 3、encodeURIComponent() 如果 URI 组件中含有分隔符,比如 ? 和 #,则应当使用 encodeURIComponent() 方法分别对各组件进行编码。 4、decodeURIComponent() 八、在 get 请求的查询字符串里, 有的字符可以使用源码,也可以使用编码过的字符。 以下三行代码在查询字符串里等效,如: %E6%88%BF%E5%B1%8B%E7%BC%96%3D %E6%88%BF%E5%B1%8B%E7%BC%96= 房屋编= 代码摘录: // 房屋编: "120103000001714" let buildingNum_f = feature.attributes.房屋编; // 房屋从属的建筑编号。 // console.log("buildingNum_f:", buildingNum_f); // let dataStr = '?where=%E6%88%BF%E5%B1%8B%E7%BC%96=%27' + Number(buildingNum_f) + '%27' + // '&text=&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Foot&relationParam=' + // '&outFields=户室,标准_1&returnGeometry=false&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=&havingClause=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&historicMoment=&returnDistinctValues=true&resultOffset=&resultRecordCount=&returnExtentOnly=false&datumTransformation=¶meterValues=&rangeValues=&quantizationParameters=&featureEncoding=esriDefault&f=pjson'; let dataStr = '?where=房屋编=%27' + Number(buildingNum_f) + '%27' + '&text=&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Foot&relationParam=' + '&outFields=户室,标准_1&returnGeometry=false&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=&havingClause=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&historicMoment=&returnDistinctValues=true&resultOffset=&resultRecordCount=&returnExtentOnly=false&datumTransformation=¶meterValues=&rangeValues=&quantizationParameters=&featureEncoding=esriDefault&f=pjson'; let self = this; this.familyNum = 0; axios .get(QConfig_house.queryUrl_address + dataStr) .then(response => {
js_UrlEncoding.txt
于 2023-02-07 17:05:51 首次发布