getByte和URLEncoder的区别

linshenxiu 2010-03-04 11:27:15
String name=String n=new String("小叮当".getBytes("utf-8"));
String name=URLEncoder.encode("小叮当","utf-8");
是不是都是将中文转换成utf-8格式的编码?这两者有什么区别呢?
...全文
191 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wcwtitxu 2010-03-20
  • 打赏
  • 举报
回复
冒火,给你废这么大口舌,
居然 无满意结果 结贴.

chenjingchun_java 2010-03-04
  • 打赏
  • 举报
回复
encode是把字符串转编码后再加密
chenjingchun_java 2010-03-04
  • 打赏
  • 举报
回复
getbytes是改变字符串的编码
encode是对字符串加密
hanzhdy 2010-03-04
  • 打赏
  • 举报
回复
这样才是UTF-8的编码
String name=String n=new String("小叮当".getBytes(), "utf-8");
海子尘 2010-03-04
  • 打赏
  • 举报
回复
从名称上就可以看出来
第二个是url传过来的参数
第一个是form
需要用到哪个看是怎么传的参数了
编码一般都整一个过滤器就搞定了
wcwtitxu 2010-03-04
  • 打赏
  • 举报
回复

// 经常看到
byte[] bytes = string.getBytes(charset1);
String newString = new String(bytes, charset2);

// 或者直接是 String newString = new String(string.getBytes(charset1), charset2);

这样的代码有什么用呢?

--------------------------------------------

来看一个例子
假如,客户端请求服务器一个页面 /abc.jsp?param=%e4%b8%ad

"%e4%b8%ad" 表示 3 字节的数据。
这 3 个字节如果按 UTF-8 的规则来解码的话,就是 "中国" 的 "中" 字.

但是容器接到请求时,并不知道要按 UTF-8 来解码.
所以,容器使用了 iso-8859-1 来解码, 按 iso-8859-1 来解码的话是得到 "ä", "¸" "­" 三个字符.
这也是为什么在 tomcat 默认配置下, request.getParameter("param") 会得到 "中" (乱码)

这时候就可以用
strValue = new String(strValue.getBytes("iso-8859-1"), "UTF-8");
先按 iso-8859-1, 编回 byte 数组, 然后重新按 正确规则(UTF-8) 解码.

------------------------------

所以:

当 byte[] 被使用错误的规则 charset1 解码后, 得到 strValue.

可以使用

strValue = new String(strValue.getBytes(charset1), charset2); // charset2 才是正确的编码规则

进行处理, 这属于一种补救措施.


-----------------------------------------------

非 "iso-8859-1" 的 byte[] 被按 iso-8859-1 解码后
可以使用 new String(stringValue.getBytes("iso-8859-1"), 正确编码) 来补救




但其它编码可能就没有这么幸运了

如果 非 GBK 的 byte[] 错误地按 GBK 解码后,可能会造成不可挽回的损失

一些内容, 使用 new String(stringValue.getBytes("GBK"), 正确编码) 也要不回来

非 UTF-8 的 byte[] 错误地按 UTF-8 解码, 也可能造成不可挽回的损失

同样的, 一些内容使用 new String(stringValue.getBytes("UTF-8"), 正确编码) 也要不回来了
wcwtitxu 2010-03-04
  • 打赏
  • 举报
回复

byte[] bytes = stringObject.getBytes(charset);
// 从数据类型上都可以看明白 String --> byte[]
// 按某一字符集编码规则, 把字符串编成二进制内容 (字符序列 到 字节序列 的转换)

String stringObject = new String(bytes, charset);
// 很明显,这是 stringObject.getBytes(charset); 的逆操作



------------------------------------------------------


// 相当于 JavaScript 里的 encodeURIComponent
// 把字符串作为 URI 组件进行编码
// 拼接构造 URI 时,经常使用到
URLEncoder.encode("小叮当", "utf-8");


URI 中,可以用 %xx 来表示一字节的数据. 其中 xx 是二位十六进制数字

下面做一个测试.


byte[] bytes = "中国人".getBytes("UTF-8"); // 按UTF-8把 "中国人" 字编码.
System.out.println(
java.util.Arrays.toString(bytes)
);
// 输出可以看到 byte 数组的内容:[-28, -72, -83, -27, -101, -67, -28, -70, -70]

// 把每个字节的都转成 %xx 的形式
for (int i=0; i<bytes.length; i++) {
System.out.print(
"%" +
Integer.toString((bytes[i]>>>4)&0x0f, 16) +
Integer.toString(bytes[i]&0x0f, 16)
);
}

System.out.println();
// 用 URLEncoder.encode 编一次
System.out.println(
java.net.URLEncoder.encode("中国人", "UTF-8").toLowerCase()
);

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧