2012-07-16 63 views
18

在我的应用程序中,我从LDAP获取用户信息,有时候完整的用户名出现错误的字符集。例如:如何在Java中检查字符串的字符集?

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

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

我可以做这个

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

但是,如果我将用它包括俄语字符的字符串保存之前将其修复(为前。“Тест61Тестович61”)我得到这样的事情“ 61“61”。

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

+0

哦不,我从来没有注意到它,但我一直在投票回答。现在我会知道,谢谢你为我指出。 – 2012-07-16 04:08:09

回答

10

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

理想的情况下,如果你能得到你所读取输入流,则可以通过像这样运行:http://code.google.com/p/juniversalchardet/

还有许多其他的字符集探测器在那里以及

+0

非常感谢您的帮助!我不确定是否可以使用UserService获取输入流cas用户数据是从上下文获取的。其他方法可能是修复LDAP中的值。 – 2012-07-18 04:37:47

0

在你的web的应用程序,您可以声明一个编码过滤器,确保您以正确的编码接收数据。

<filter> 
    <description>Explicitly set the encoding of the page to UTF-8</description> 
    <filter-name>encodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

Spring提供的过滤器确保控制器/ servlet以UTF-8接收参数。

+1

这仅适用于弹簧应用程序。此外,如果正在使用基本身份验证,则强制编码可能不起作用。 – 2015-04-14 13:16:16

1

您的LDAP数据库设置不正确。应用程序将数据放入它应该转换为已知的字符集编码,在你的情况下,可能是UTF_16。选择一个标准。所有检测编码的方法都是猜测。

编写该值的应用程序是唯一知道它正在使用哪种编码并可以正确转换为其他编码(如UTF_16)的应用程序。

1

我推荐Apache.tika CharsetDetector,非常友好和强大。

CharsetDetector detector = new CharsetDetector(); 
detector.setText(yourStr.getBytes()); 
detector.detect(); // <- return the result, you can check by .getName() method 

此外,你可以任意编码字符串转换成你想要的一个,以UTF-8作为例子:

detector.getString(yourStr.getBytes(), "utf-8"); 
0

我有同样的问题。 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(); 
} 

全面介绍在这里:Detect the charset in Java strings

+0

嘿@ LIuis欢迎来到堆栈溢出请张贴来自该网站的特定代码,而不是只给出链接。 – Dilip 2017-12-13 10:28:39

+0

完成@Dilip ;-) – 2017-12-13 10:57:47