私のアプリケーションでは、LDAPからユーザー情報を取得していますが、完全なユーザー名が間違った文字セットで入力されることがあります。例えば:
ТеÑÑ61 ТеÑÑовиÑ61
また、英語またはロシア語で正しく表示される場合もあります。ユーザー名が変更されると、データベースで更新されます。 dbの値を変更しても、問題は解決しません。
これを行うことで保存する前に修正できます
new String(incorrect.getBytes("ISO-8859-1"), "UTF-8");
ただし、ロシア語の文字を含む文字列(たとえば、「Тест61Тестович61」)に使用すると、「???? 61 ???????? 61」のようなメッセージが表示されます。
文字列の文字セットを決定できるものを提案していただけますか?
AFAIKのJavaの文字列は、元のエンコーディングを保持しません-それらは常に何らかのUnicode形式で内部的に保存されます。元のストリーム/バイトの文字セットを検出したい-これが、String.toBytes()呼び出しが遅すぎると思う理由です。
理想的には、読み取り元の入力ストリームを取得できれば、次のような方法で実行できます。 http://code.google.com/p/juniversalchardet/
他にも文字セット検出器がたくさんあります
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");
LDAPデータベースが正しくセットアップされていません。データを挿入するアプリケーションは、既知の文字セットエンコーディングに変換する必要があります。この場合は、おそらくUTF_16です。標準を選択してください。エンコーディングを検出するすべての方法は推測です。
値を書き込むアプリケーションは、使用しているエンコーディングを明確に認識しており、UTF_16などの別のエンコーディングに適切に変換できる唯一のアプリケーションです。
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>
スプリングが提供するフィルターは、コントローラー/サーブレットがUTF-8でパラメーターを受け取るようにします。