首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java URLEncode给出不同的结果

Java URLEncode给出不同的结果
EN

Stack Overflow用户
提问于 2013-08-24 01:34:35
回答 1查看 1K关注 0票数 3

我有一个代码存根:

代码语言:javascript
复制
System.out.println(param+"="+value);
param = URLEncoder.encode(param, "UTF-8");
value = URLEncoder.encode(value, "UTF-8");
System.out.println(param+"="+value);

这在Eclipse中得到了这样的结果:

代码语言:javascript
复制
p=指甲油
p=%E6%8C%87%E7%94%B2%E6%B2%B9

但是,当我从命令行运行相同的代码时,我得到以下输出:

代码语言:javascript
复制
p=指甲油
p=%C3%8A%C3%A5%C3%A1%C3%81%C3%AE%E2%89%A4%C3%8A%E2%89%A4%CF%80

有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-24 02:37:47

您的Mac在终端中使用Mac编码。在发送到Java之前,这些汉字被错误地解释为使用Mac编码而不是UTF-8编码。

作为证据,这些汉字存在于以下(十六进制)字节的UTF-8编码中:

  • = 0xE6 0x8C 0x87
  • = 0xE7 0x94 0xB2
  • = 0xE6 0xB2 0xB9

然后检查Mac罗马代码页布局,这些(十六进制)字节表示以下字符:

  • 0xE6 0x8C 0x87 = Ê å á
  • 0xE7 0x940xB2= Á î
  • 0xE6 0xB2 0xB9 = Ê π

现在,将它们放在一起并使用UTF-8对它们进行URL编码:

代码语言:javascript
复制
System.out.println(URLEncoder.encode("指甲油", "UTF-8"));

看它印了什么?

%C3%8A%C3%A5%C3%A1%C3%81%C3%AE%E2%89%A4%C3%8A%E2%89%A4%CF%80

要解决问题,请告诉Mac在终端中使用UTF-8编码.老实说,我不能从头上回答这个问题,就像我不回答麦克一样。您的Eclipse编码配置是完全正确的,但是在这种情况下,您可以通过Window > Preferences > General > Workspace > Text来配置它。

更新:我错过了一条评论:

我正在读取文本文件中的值。

如果这些变量来自一个文本文件,而不是命令行输入--正如我最初所期望的-,那么您需要以不同的方式解决这个问题。显然,您使用的是一个Reader实现,它使用运行时环境的默认字符编码,如下所示:

代码语言:javascript
复制
Reader reader = new FileReader("/file.txt");
// ...

相反,您应该在创建读取器时显式地指定所需的编码。您可以使用InputStreamReader构造函数来实现这一点。

代码语言:javascript
复制
Reader reader = new InputStreamReader(new FileInputStream("/file.txt"), "UTF-8");
// ...

这将显式地告诉Java使用UTF-8来读取/file.txt,而不是运行时环境的默认编码,因为Charset#defaultCharset()是可用的。

代码语言:javascript
复制
System.out.println("This runtime environment uses as default charset " + Charset.defaultCharset());
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18414055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档