2012-07-16 141 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