Android UTF-8 vs ANSI .equals不工作/如何更改charset?

时间:2014-05-12 22:10:05

标签: java android string utf-8

我从csv或txt文件中读取了我的Android应用程序列表。

如果使用Notepad ++对文件进行UTF-8编码,请将列表设置为正确。但我无法使用.equals搜索/查找字符串。

如果文件是用寡妇作为ansi编码的,则无法看到äöü等。但现在我可以找到字符串了。

现在我的问题。我怎样才能发现我的字符串有什么字符集?

我将我的frist字符串(来自文件)与另一个字符串进行比较,使用searchview在应用程序中读取。

我“认为”我的应用中的搜索视图字符串也是ansi,如何将其更改为UTF-8并希望比较再次起作用。

Android 4.4.2

谢谢

以下剂量工作:

String s = null;
try
{
    s = new String(query.getBytes(), "UTF-8");
}
catch (UnsupportedEncodingException e)
{
    Log.e("utf8", "conversion", e);
}

1 个答案:

答案 0 :(得分:1)

无论字符串数据来自何处,Java字符串始终都编码为UTF-16。

在将源数据转换为Java字符串时,正确识别源数据的字符集非常重要。如果new String(query.getBytes(), "UTF-8")数组实际上是UTF-8编码,byte[]将正常工作。如果指定了错误的字符集,则只有在指定Java不支持的字符集时才会出现UnsupportedEncodingException错误。但是,如果指定Java支持的字符集,然后数据解码失败(通常是因为您为数据指定了错误的字符集),则会出现其他错误,例如MalformedInputException或{{ 1}},或者更糟糕的是,你根本不会得到任何错误,而且畸形/非法字节将简单地转换为Unicode UnmappableCharacterException替换字符。如果您需要在转换过程中更好地控制错误处理,则需要使用CharsetDecoder类。

有时,UTF编码的文件会在前面有一个BOM,因此您可以检查它。但Ansi文件不使用BOM。如果文件中不存在UTF BOM,那么您必须分析原始数据并进行猜测(如果您猜错了会导致问题),或者只是询问用户使用哪个字符集。

始终了解数据的字符集。如果你不知道,请问。避免猜测。