从互联网获取的文本的UTF8转换

时间:2011-12-16 04:16:03

标签: java utf-8

ElasticSearch是一个只接受UTF8数据的搜索服务器。

当我试图按照文本

提供ElasticSearch时
  

可能符合较轻报告负荷的小型企业包括年营业额低于44万英镑,净资产低于22万英镑且员工少于10人的企业“

通过我的java应用程序 - 基本上我的java应用程序从网页获取此信息,并将其提供给elasticSearch。 ES投诉它无法理解£并且它失败了。通过以下代码过滤后 -

byte bytes[] = s.getBytes("ISO-8859-1");
s = new String(bytes, "UTF-8");

此处£已转换为

但是当我使用bash将它复制到我的主目录中的文件时,它会很好。任何指针都会有所帮助。

3 个答案:

答案 0 :(得分:3)

bytes中有ISO-8895-1八位字节,然后告诉String解码,好像它是UTF-8一样。当它这样做时,它不识别非法的0xA3序列并用替换字符替换它。

为此,您必须使用它使用的编码构造字符串,然后将其转换为您想要的编码。请参阅How do I convert between ISO-8859-1 and UTF-8 in Java?

答案 1 :(得分:0)

UTF-8比人们想象的容易。在String中,一切都是unicode字符。 字节/字符串转换按如下方式完成。 (注意Cp1252或Windows-1252是ISO-8859-1的Windows Latin1扩展;更好用 那一个。)

BufferedReader in = new BufferedReader(
        new InputStreamReader(new FileInputStream(file), "Cp1252"));
PrintWriter out = new PrintWriter(
        new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
response.setContentType("text/html; charset=UTF-8");
response.setEncoding("UTF-8");
String s = "20 \u00A3"; // Escaping

要了解为什么Cp1252比ISO-8859-1更合适: http://en.wikipedia.org/wiki/Windows-1252

答案 2 :(得分:-1)

String s是一系列基本上与任何字符编码无关的字符(确定,不完全独立,但现在足够接近我们的需要)。无论您将数据加载到String中的数据编码是什么,都已经过解码。解码是使用系统默认编码(实际上总是错误,不使用系统默认编码,相信我,我有超过10年的处理与错误的默认编码相关的错误的经验)或您明确指定的编码完成当你加载数据时。

当您为字符串调用getBytes(“ISO-8859-1”)时,请求根据ISO-8859-1编码将字符串编码为字节。

从字节数组创建String时,需要指定表示字节数组中字符的编码。您可以使用UTF-8编码的字节数组创建一个字符串(就在您上面用ISO-8859-1编码它,这是您的错误)。

您想要做的是:

byte bytes[] = s.getBytes("UTF-8");
s = new String(bytes, "UTF-8");