35

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

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

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

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

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

ただし、ロシア語の文字を含む文字列(たとえば、「Тест61Тестович61」)に使用すると、「???? 61????????61」のようになります。

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

4

6 に答える 6

20

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

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

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

于 2012-07-16T04:54:47.990 に答える
2

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

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

于 2015-04-29T16:27:50.977 に答える
0

Web アプリケーションでは、正しいエンコーディングでデータを受信することを保証する encoding-filter を宣言できます。

<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 で受け取るようになります。

于 2012-07-16T06:10:09.973 に答える