如何检查Java中字符串的字符集?

2022-09-01 06:08:56

在我的应用程序中,我从LDAP获取用户信息,有时完整的用户名带有错误的字符集。例如:

ТеÑÑ61 ТеÑÑовиÑ61

它也可以是英文或俄文,并正确显示。如果用户名更改,则会在数据库中更新。即使我更改了数据库中的值,它也不会解决问题。

我可以在保存之前通过执行此操作来修复它

new String(incorrect.getBytes("ISO-8859-1"), "UTF-8");

但是,如果我将其用于包含俄语字符的字符串(例如,“Тест61 Тестович61”),我得到这样的东西“????61 ????????61".

你能建议一些可以确定字符串字符集的东西吗?


答案 1

Java中的字符串AFAIK不保留其原始编码 - 它们始终以某种Unicode形式存储在内部。你想检测原始流/字节的字符集 - 这就是为什么我认为你的String.toBytes()调用为时已晚。

理想情况下,如果您可以从中获取正在读取的输入流,则可以通过如下方式运行它:http://code.google.com/p/juniversalchardet/

还有很多其他字符集探测器


答案 2

我遇到了同样的问题。Tika 太大,而 juniversalchardet 无法检测到 ISO-8859-1。所以,我自己做了,现在在生产中运作良好:

public String convert(String value, String fromEncoding, String toEncoding) {
  return new String(value.getBytes(fromEncoding), toEncoding);
}

public String charset(String value, String charsets[]) {
  String probe = StandardCharsets.UTF_8.name();
  for(String c : charsets) {
    Charset charset = Charset.forName(c);
    if(charset != null) {
      if(value.equals(convert(convert(value, charset.name(), probe), probe, charset.name()))) {
        return c;
      }
    }
  }
  return StandardCharsets.UTF_8.name();
}

此处的完整描述:检测 Java 字符串中的字符集