web-dev-qa-db-ja.com

Javaで文字列の文字セットを確認するにはどうすればよいですか?

私のアプリケーションでは、LDAPからユーザー情報を取得していますが、完全なユーザー名が間違った文字セットで入力されることがあります。例えば:

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

また、英語またはロシア語で正しく表示される場合もあります。ユーザー名が変更されると、データベースで更新されます。 dbの値を変更しても、問題は解決しません。

これを行うことで保存する前に修正できます

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

ただし、ロシア語の文字を含む文字列(たとえば、「Тест61Тестович61」)に使用すると、「???? 61 ???????? 61」のようなメッセージが表示されます。

文字列の文字セットを決定できるものを提案していただけますか?

26

AFAIKのJavaの文字列は、元のエンコーディングを保持しません-それらは常に何らかのUnicode形式で内部的に保存されます。元のストリーム/バイトの文字セットを検出したい-これが、String.toBytes()呼び出しが遅すぎると思う理由です。

理想的には、読み取り元の入力ストリームを取得できれば、次のような方法で実行できます。 http://code.google.com/p/juniversalchardet/

他にも文字セット検出器がたくさんあります

14
radai

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");
4
Zanecat

LDAPデータベースが正しくセットアップされていません。データを挿入するアプリケーションは、既知の文字セットエンコーディングに変換する必要があります。この場合は、おそらくUTF_16です。標準を選択してください。エンコーディングを検出するすべての方法は推測です。

値を書き込むアプリケーションは、使用しているエンコーディングを明確に認識しており、UTF_16などの別のエンコーディングに適切に変換できる唯一のアプリケーションです。

1
Evan Langlois

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でパラメーターを受け取るようにします。

0
sangupta