在http响应处理或文本操作期间,“En dash”出现乱码

时间:2011-06-30 07:20:05

标签: java utf-8 character-encoding wikipedia-api apache-httpcomponents

我正在编写代码来处理来自维基百科的文本,并且我遇到麻烦的问题。我之前没有使用过破折号或其他非标准字符(对我来说不是标准键盘上没有出现的字符;),所以我不知道在哪里指出我的意思做错了。这是正在发生的事情,以及代码片段......

我向维基百科发送请求(我正在使用Apache HttpComponents客户端API与维基百科进行通信)以获取文章的内容并将其保存在字符串中:

DefaultHttpClient client = new DefaultHttpClient();
HttpGet queryRequest = new HttpGet(query);  // query is the URL for retrieving the article contents.
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = client.execute(queryRequest, responseHandler);

此时,如果我要将“responseBody”发送到System.out,则在我的Eclipse控制台中将短划线显示为“?”。这可能只是一个Eclipse控制台显示问题,所以我将继续。

我操纵文本,忽略en破折号,然后将文本发送回维基百科。

List<NameValuePair> postParams = new ArrayList<NameValuePair>();
postParams.add(new BasicNameValuePair("text", content);  // content is a String with the article text
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(postParams, "UTF-8");
HttpPost queryRequest = new HttpPost(url);  // url is the basic URL for the Wikipedia api
queryRequest.setEntity(entity);
queryRequest.addHeader("Content-Type", "application/x-www-form-urlencoded");
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = client.execute(queryRequest, responseHandler);

当现在上传到维基百科的文本显示在网络浏览器中时,之前的破折号现在显示为“?”在一个盒子里(未知的角色?)。因此,在某些地方,我无意中改变或错误编码,但我不确定究竟在哪里。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

现在回答真实的答案。非英文字符被破坏的问题与Apache HTTPComponents或Java字符串处理/操作无关。问题出在Windows上运行的Eclipse IDE。

运行配置中的Eclipse默认使用系统的默认编码方法Cp1252 for Windows。由于Cp1252不支持所有UTF-8字符,因此出现问题。我找到了solution here。在Eclipse中,您将进入运行配置。对于您尝试运行的项目,请转到“公共”选项卡。有一个编码部分。将其从“默认”更改为“其他”,并将编码设置为UTF-8。

一切都很好。

答案 1 :(得分:0)

我还没有弄清楚为什么endash会被破坏。我确实有一个(可能是kludgy)修复。

String unknownUTF = String.copyValueOf(Character.toChars(65533));
content = content.replace(unknownUTF, "\u2013");

我基本上用endash字符替换'未知'UTF-8字符的所有实例。这可以假设原始内容不包含任何其他转换为“未知”字符的UTF-8字符。