\x 的解码

\xE4\xBD\xA0\xE5\xA5\xBD 解码
感谢 http://www.bejson.com/convert/ox2str/

p e4 bd a0
P -100 -61 -32
P 11100100 10111101 10100000
J -28 -67 -96
J 10011100 11000011 11100000

p e5 a5 bd
P -101 -37 -61
P 11100101 10100101 10111101
J -27 -91 -67
J 10011011 11011011 11000011

Java:你好[-28, -67, -96, -27, -91, -67]

\xE4\xBD\xA0\xE5\xA5\xBD –> e4bda0e5a5bd –> 你好

与python的关系

python2

普通字符串常量,默认utf-8
    >>> a = 'aa'
    >>> type(a[0])
    <type 'str'>


bytes
    >>> bytes #(str == bytes)为 Ture
    <type 'str'>

bytearray
    <type 'bytearray'>

    r'xxx';
        非转义的原始字符串 
    u'xxx';
        不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码。

python3

普通字符串常量 <class 'str'>,默认unicode
    >>> a = 'aa'
    >>> type(a[0])
    <class 'str'>
bytes :<class 'bytes'>
bytearray:<class 'bytearray'>

    r'xxx';
    u'xxx';
    b'xxx';
        python3.x里默认的str是unicode, bytes是(py2.x)的str, b”“前缀代表的就是bytes 
        python2.x里, b前缀没什么具体意义, 只是为了兼容python3.x的这种写法

HBase中取出来了字符串中文不能直接显示

所有这里实现了解析\x中文 英文字符集 混合编码,,,

   #-*-coding:utf-8-*-

# python2 实现

def dvstr(r):
    barr = bytearray();
    rlen = len(r);
    i = 0;
    while i < rlen:
        if r[i] == '\\' and r[i+1] == 'x':
            barr.append(r[i+2])
            barr.append(r[i+3])
            i+=4;
        else:
            hexc = hex(ord(r[i]))
            barr.append(hexc[2])
            barr.append(hexc[3])
            i+=1;
    hexstr = str(barr);
    return hexstr.decode('hex')

def evstr(s):
    barr = bytearray();
    for c in s:
        size = ord(c);
        if size >0 and size < 127:
            barr.append(c)
        else:
            hexc = hex(size)
            barr.append("\\")
            barr.append("x")
            barr.append(hexc[2])
            barr.append(hexc[3])
    return str(barr)

rstr = r'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a121A\xe5\x8f\xb7'
sstr = dvstr(rstr)
print(sstr)
sstr = "你好啊121A号";
rstr = evstr(sstr);
print(rstr)


# python3 实现

def dvstr(r):
    barr = bytearray();
    rlen = len(r);
    i = 0;
    while i < rlen:
        if r[i] == '\\' and r[i+1] == 'x':
            barr.append(ord(r[i+2]))
            barr.append(ord(r[i+3]))
            i+=4;
        else:
            hexc = hex(ord(r[i]))
            barr.append(ord(hexc[2]))
            barr.append(ord(hexc[3]))
            i+=1;
    hexstr = str(barr,'utf-8');
    return bytes.fromhex(hexstr).decode('utf-8')

def evstr(s):
    s = s.encode("UTF-8")
    barr = bytearray();
    for c in s:
        size = c;
        if size >0 and size < 127:
            barr.append(c)
        else:
            hexc = hex(size)
            barr.append(92)# \ 92 x 120
            barr.append(120)
            barr.append(ord(hexc[2]))
            barr.append(ord(hexc[3]))
    return str(barr,'utf-8')

sstr = "你A";
rstr = evstr(sstr);
print(rstr)
rstr = r'\xe4\xbd\xa0A'
sstr = dvstr(rstr)
print(sstr)

java端解码

    /**
     * @ 解码字符串
     */
    public static String drstr(String rstr) {
        byte[] bs = rstr.getBytes();
        ByteBuffer buf = ByteBuffer.allocate(bs.length);
        for (int i = 0; i < bs.length; i++) {
            if (bs[i] == 92 && bs[i + 1] == 120) {
                Integer in = Integer.valueOf((char) bs[i + 2] + "" + (char) bs[i + 3], 16);
                in = in & 0xFF;
                buf.put(in.byteValue());
                i += 3;
            } else {
                buf.put(bs[i]);
            }
        }
        return new String(buf.array()).trim();
    }

    /**
     * @ 字符串重编码
     */
    public static String erstr(String str) {
        final byte[] prefix = "\\x".getBytes();
        ByteBuffer buf = ByteBuffer.allocate(str.length()*24);//
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if (ch >= 0 && ch <= 127) {
                Integer num = (int) ch;
                buf.put(num.byteValue());
            } else {
                byte[] cbs = String.valueOf(ch).getBytes();
                for (byte b : cbs) {
                    int v = b & 0xFF;
                    String hv = Integer.toHexString(v).toUpperCase();
                    buf.put(prefix);
                    buf.put(hv.getBytes());
                }
            }
        }
        return new String(buf.array()).trim();
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: encodeURIComponent和decodeURIComponent是JavaScript中的两个函数,用于对URL进行编码解码。 encodeURIComponent函数将字符串作为参数,将其中的特殊字符进行编码,以便于在URL中传输。例如,空格会被编码为%20,中文字符会被编码为%XX的形式。 decodeURIComponent函数则是对已经编码的字符串进行解码,将其中的特殊字符还原为原始字符。例如,%20会被解码为空格,%XX会被解码为对应的中文字符。 在Java中,也有类似的编码解码函数,例如URLEncoder和URLDecoder。这些函数可以用于对URL进行编码解码,以便于在Java程序中进行网络传输。 ### 回答2: encodeURIComponent和decodeURIComponent是JavaScript内置的函数,用于对URL进行编码解码,其中encodeURIComponent用于将特殊字符转换为URL安全字符,而decodeURIComponent则用于将URL安全字符转换为原始字符。 在Java中,可以使用URLEncoder类和URLDecoder类来实现与JavaScript中的encodeURIComponent和decodeURIComponent函数类似的功能。URLEncoder类用于将可再UBO 中使用的字符串转换为application/x-www-form-urlencoded格式,而URLDecoder类则用于将这种格式的字符串转换回原始字符串。 示例代码如下: // 编码 String encodedStr = URLEncoder.encode("姓名:张三&年龄:20", "UTF-8"); System.out.println(encodedStr); // 输出:%E5%A7%93%E5%90%8D%EF%BC%9A%E5%BC%A0%E4%B8%89%26%E5%B9%B4%E9%BE%84%EF%BC%9A20 // 解码 String decodedStr = URLDecoder.decode("%E5%A7%93%E5%90%8D%EF%BC%9A%E5%BC%A0%E4%B8%89%26%E5%B9%B4%E9%BE%84%EF%BC%9A20", "UTF-8"); System.out.println(decodedStr); // 输出:姓名:张三&年龄:20 需要注意的是,当使用URLEncoder类进行编码时,需要指定编码字符集(比如UTF-8),否则可能导致乱码问题。而在解码时,不仅需要指定字符集,还需要考虑URL的合法性,如果存在非法字符(比如空格等),则可能会抛出异常。因此,在使用时需要仔细阅读相关文档并进行测试。 ### 回答3: encodeURIComponent和decodeURIComponent是JavaScript中的两个函数,用于将字符串进行编码解码。其中encodeURIComponent是对传入的字符串进行URL编码,将字符串中的特殊符号转义,以便于在URL中使用,而decodeURIComponent则是对URL编码后的字符串进行解码,还原出原始字符串。 在Java中,可以通过使用java.net包中的URLEncoder和URLDecoder类来实现类似的功能。URLEncoder类可以使用encoding参数来指定编码方式,默认为UTF-8。它的encode方法可以将字符串进行URL编码,而decode方法则是对URL编码的字符串进行解码。以下是一个使用URLEncoder和URLDecoder的简单例子: ``` import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; public class Main { public static void main(String[] args) { String url = "https://www.example.com/?name=张三&age=18"; try { // 对url进行编码 String encodedUrl = URLEncoder.encode(url, "UTF-8"); System.out.println("Encoded url: " + encodedUrl); // 对编码后的url进行解码 String decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8"); System.out.println("Decoded url: " + decodedUrl); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } ``` 此例中,URLEncoder将url进行了编码,得到了一个包含特殊字符的字符串,而URLDecoder则将其解码还原出原始字符串。需要注意的是,URL编码后的字符串在URL中使用时需要使用%20等编码字符代替空格等特殊字符,否则可能导致网页无法正常访问。因此,在使用URL编码前需要了解编码格式和要编码的内容,以免出现意外情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值