ElasticSearch是一个只接受UTF8数据的搜索服务器。
当我试图按照文本
提供ElasticSearch时可能符合较轻报告负荷的小型企业包括年营业额低于44万英镑,净资产低于22万英镑且员工少于10人的企业“
通过我的java应用程序 - 基本上我的java应用程序从网页获取此信息,并将其提供给elasticSearch。 ES投诉它无法理解£并且它失败了。通过以下代码过滤后 -
byte bytes[] = s.getBytes("ISO-8859-1");
s = new String(bytes, "UTF-8");
此处£
已转换为�
但是当我使用bash将它复制到我的主目录中的文件时,它会很好。任何指针都会有所帮助。
答案 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");