2017-06-09 7 views
0

私たちのデータベースでは、UTF-8の印刷できない文字をサポートする機能を実装しています。私たちのシステムはそれらをデータベースに保存し、それらを検索します。ベース64の形で入力を収集し、バイト配列に変換してデータベースに格納します。取得中、データベースはバイト配列を返し、再び64に変換します。UTF-8の非印字文字 - SUSE Linux Javaはサポートしていません

検索処理中(dbが私たちにバイト配列を与えた後)、すべての属性は文字列配列に変換され、後で再度バイト配列に変換され、再び基底64に変換されて元に戻されます。ユーザー。

以下のコードは、Windows JDK(Java 8バージョン)で正しくコンパイルされ、正しく動作します。しかし、これがSuSe Linux環境に置かれると、奇妙な文字が表示されます。

public class Tewst { 


public static void main(String[] args) { 
    byte[] attributeValues; 
    String utfString ; 

    attributeValues = new byte[]{-86, -70, -54, -38, -6}; 
    if (attributeValues != null) { 
     utfString = new String(attributeValues); 
     System.out.println("The string is "+utfString); 
    } 
} 

}

与えられた出力が

ある "文字列がªºÊÚúある"

同じファイルがSUSE LINUXディストリビューション上で実行されたときに今、それは私を与えます:

"文字列は "

WindowsとLinuxの両方でJava 8を使用しています。 Linuxで正しく動作しないという問題は何ですか?

ところで、私たちも `utfString = new String(attributeValues、" UTF-8 ")を試みました。 。それはとにかく助けになりませんでした。何が足りないの?

+0

私は、これはJavaプログラムとは関係がありませんが、文字列を印刷するために使用しているフォントとは関係ありません。 – Henry

+0

もしそうなら、文字列がバイト配列に変換されるとき、それは元のバイト配列を返さなければなりませんが、元のバイト配列ではなく、何か他のものを与えています。バイト配列には5つの値の代わりに15の値が得られます。 – javaShilp

+2

この変換テストのコードを表示できますか? – Henry

答えて

1

ªºÊÚúは、Unicode 00AA 00BA 00CA 00DA 00FAです。

文字セットISO-8859-1では、これはバイトAA BA CA DA FAです。
10進数では、コードにあるとおり、{-86, -70, -54, -38, -6}になります。

あなたの文字列はUTF-8ではなくISO-8859-1でエンコードされています。なぜなら、LinuxはUTF-8を使用し、WindowsはISO-8859-1を使用するため、Linuxでは動作しません。

決してあなたはそれがあるかもしれないものは何でもJVMのデフォルト文字セットを、欲しい絶対に確信している場合を除き、new String(byte[])を使用しています。

コードをnew String(attributeValues, StandardCharsets.ISO_8859_1)に変更してください。
もちろん逆の操作ではstr.getBytes(StandardCharsets.ISO_8859_1)を使用してください。
次に、プラットフォームのデフォルトを使用しないようにコード化するので、さまざまなプラットフォームで一貫して動作するはずです。

+0

それは働いた! :) どうもありがとうございました。私たちはUTF-8エンコーディングを使用しているという印象を受けており、エンコーディングはUTF-8ではないことに気づいたと思います。ありがとうアンドレアス。 – javaShilp

関連する問題