与URL相关的问题

时间:2010-03-16 08:25:46

标签: java internationalization

亲爱的,现在我在我的java程序中有这个问题,我认为它应该归类为URL问题,但不是100%肯定。如果你认为我错了,请随意重新分类这个问题,谢谢。

我会尽可能简单地陈述我的问题。 我在着名的中文搜索引擎baidu.com上搜索了一个中文关键词“奥巴马”(奥巴马用英文),我这样做是为了将一个URL(在Java程序中)传递给浏览器,如: / p>

http://news.baidu.com/ns?word=奥巴马

它就像我在baidu.com上的文本字段中输入“奥巴马”关键字一样完美。

然而,现在我的顾问想要另一件事。既然他不能阅读中文网页,但他想确保我从百度获得的网页与“奥巴马”有关,他让我谷歌将其翻译回来,即使用谷歌翻译并将中文网页翻译成英文网页。

这听起来很简单。但是,我在这里遇到了我的问题。

如果我只是将网址“http://news.baidu.com/ns?word=奥巴马”传递到Google翻译并勾选“中文到英文”翻译选项,结果看起来很糟糕。(我不知道这里的线索,可能与中文字符编码有关)。

或者,如果现在我的浏览器打开“”http://news.baidu.com/ns?word=奥巴马“网页,但我点击”百度一下“按钮(这只是”搜索“),您会注意到网址会被更改,现在如果我将此网址传递给Google翻译并做同样的事情,结果效果更好。

我希望我没有让这个问题听起来太复杂,我为一些中文单词道歉,但我真的需要你们这里的帮助。我在Java程序中做了所有这些,我无法弄清楚如何实现“百度一下”(按搜索按钮)步骤然后获取新的URL。如果我能得到新的URL,事情很简单,我可以在我的Java代码中调用Google翻译,并弹出新窗口告诉我的顾问。

请在这里分享您的任何想法或想法。谢谢。

罗伯特

4 个答案:

答案 0 :(得分:2)

您可以使用

URLEncoder.encode("http://news.baidu.com/ns?word=奥巴马", "utf-8")

然后将生成的网址传递给Google翻译,如:

http://translate.google.com/translate?js=y&prev=_t&hl=en&ie=UTF-8&layout=1&eotf=1&sl=zh-CN&tl=en&u=YOUR_URL

干杯

答案 1 :(得分:1)

尝试拨打

URLEncoder.encode("http://news.baidu.com/ns?word=奥巴马", "utf-8")

(或utf-16;我对汉字表示不太熟悉)

答案 2 :(得分:1)

当您按搜索按钮时,浏览器会将搜索字词编码为%E5%A5%A5%E5%B7%B4%E9%A9%AC,这是奥巴马的UTF-8编码。这样做是因为UTF-8是HTML表单的默认编码。

Java在内部使用UTF-16编码,因此如果您没有指定任何内容,URL库可能会以该编码构建请求。

但是,我无法使用Google翻译重现您的问题 - 无论我如何操作,粘贴该网址似乎都能正常运行。

答案 3 :(得分:1)

网址只能包含ASCII字符。必须将所有其他字符转换为字节,然后以ASCII格式编码。但是,没有使用charset将chars转换为字节的任务。建议使用UTF-8,但不是必需的。只要服务器在charset上表达它的首选项,客户端就应该尊重它并使用相同的charset进行编码。

您可以从页面信息中看到baidu使用gb2312编码。其页面上的表格中的奥巴马字符将转换为gb2312中的字节:B0C2 B0CD C2ED,然后% - 编码为%B0%C2%B0%CD%C2%ED。这就是实际发送到百度服务器的内容http://www.baidu.com/s?wd=%B0%C2%B0%CD%C2%ED

您的操作系统默认配置为使用gb2312,因此当您将http://news.baidu.com/ns?word=奥巴马粘贴到浏览器时,浏览器会执行相同操作,并且百度会获得正确的字符。当我在浏览器中粘贴该URL时,它会搞砸,因为我的操作系统使用UTF-8,浏览器用UTF-8编码这些中文字符,而不是baidu预期的。 (直接在浏览器中输入URL时,浏览器可能没有与服务器通信,也不知道服务器喜欢的字符集,因此浏览器使用平台默认字符集)

现在,Google使用UTF-8。这就是为什么如果你将URL粘贴到谷歌表格,它会像我的操作系统一样搞砸了。字符以UTF-8编码,百度将尝试将其解析为gb2312,并且完全错误的单词。

解决方案很简单。只需按照服务器期望的方式对参数进行编码:

"http://news.baidu.com/ns?word=" + URLEncoder.encode("奥巴马", "gb2312")