2011-07-18 7 views
1

からのJavaとの特別なcharatters(æのøAの)を読みます。は、私が(JDBCドライバとGlassFish tooplinkを使用)、Oracleデータベースから特別charattersを読んで問題を抱えているOracleデータベース

私は、データベースに、データが正しく保存され、Webサービスを介してデータベースに名前「GRØNLÅENKJÆTIL」を記憶して。

しかし、私はこの文字列を読んだときに、ログファイルに印刷し、バイト配列の聖霊降臨祭でこれを変換し、このコード:

int pos = 0; 
byte[] msg=new byte[1024]; 

String F = "F" + passenger.getName(); 
logger.debug("Add " + F + " " + F.length()); 
msg = addStringToArrayBytePlusSeparator(msg, F,pos); 

..............

private byte[] addStringToArrayBytePlusSeparator(byte[] arrDest,String strToAdd,int destPosition) 
    { 
     System.arraycopy(strToAdd.getBytes(Charset.forName("ISO-8859-1")), 0, arrDest, destPosition, strToAdd.getBytes().length); 

     arrDest = addSeparator(arrDest,destPosition+strToAdd.getBytes().length,1); 

     return arrDest; 
    } 
ログファイルに

1)がある。)が印刷されていません(名前は正しくないとF.length()「FGRÃNLÃを追加します」。

2)コードスロー: java.lang.ArrayIndexOutOfBoundsException java.lang.System.arraycopy(ネイティブメソッド) でit.edea.ebooking.business.chi.control.VingCardImpl.addStringToArrayBytePlusSeparatorで(Test.java 225)。

戦車

+0

私はWindows OSでこのプロジェクトを実行するとうまく動作しますが、Linuxシステムでは問題は解決しません。 – Luigi

答えて

3

あなたはSystem.arraycopyコール内で、文字エンコーディングを指定せずにstrToAdd.getBytes()を呼んでいる - だけでなくISO-8859-1ではないかもしれない、システムのデフォルトのエンコードを、使用することになります。どのエンコーディングを使用するかは一貫していなければなりません。率直に言って私はあなたが選択肢がある場合は、ISO - 8859 - 1ではなく、UTF - 8を使用することをお勧めしますが、それは別の問題です。

は、なぜあなたは、この時点でとにかくバイト配列を扱っていますか?なぜ文字列を使用しないのですか?

addStringToArrayBytePlusSeparatorメソッドでは、コピーされたバイト数が示されていないことに注意してください。これは、呼び出し元が後で何を行うべきかわからないことを意味します。このようなあなた必見使用のバイト配列ならば、私はaddStringToArrayBytePlusSeparatorリターン新たな「論理配列の終わり」またはコピーされたバイト数のいずれかを行うことをお勧めしたいです。例:

private static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); 

/** 
* (Insert fuller description here.) 
* Returns the number of bytes written to the array 
*/ 
private static int addStringToArrayBytePlusSeparator(byte[] arrDest, 
               String strToAdd, 
               int destPosition) 
{ 
    byte[] encodedText = ISO_8859_1.getBytes(strToAdd); 
    // TODO: Verify that there's enough space in the array 

    System.arraycopy(encodedText, 0, arrDest, destPosition, encodedText.length); 

    return encodedText.length; 
} 
0

エンコード/デコードの問題は難しいです。すべてのプロセスステップで、正しいエンコード/デコードを行う必要があります。だから、

  1. は、データベースにデータを格納したい、とどの文字エンコーディングにしたいコードするその文字のバイト(入力ストリーム)と文字(読者、ストリングス)
  2. 選択の違いに慣れますあなたのwebserviceを公開する。データベースに初期データをロードするときに、正しいエンコーディングであることを確認してください。
  3. は、適切なデータベースプロパティに接続してください。 mysqlに接続URLに追加が必要です。?useUnicode=true&characterEncoding=UTF-8 UTF-8を使用する場合は、oracleについてわかりません。
  4. あなたが特定のステップで/デバッグを印刷し、それがOKに見える場合、あなたは右のそれをしなかったことを確認することはできません。ロガーは間違ったエンコーディングで書き込むことができます。あなたの端末は、奇妙なバイトエンコーディングを正しく処理しないかもしれません。コマンドラインデータベースクライアントでも同様です。あなたのデータは誤って保存されるかもしれませんが、間違って設定された端末はデータを正しいと解釈/表示します。
  5. XMLでは、ストリームエンコードだけでなく、xmlエンコード属性も重要です。
関連する問題