2016-05-13 1 views
2

データベース内からフォルダを作成するためのコードがあります(java/PL/SQLの組み合わせ)。Javaデータベースを使用してユニコード文字でフォルダを作成する

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "rtp_java_utils" AS 
import java.io.*; 

public class rtp_java_utils extends Object 
{ 
    public static int mkdir (String path) { 
    File myFile = new File (path); 
    if (myFile.mkdir()) return 1; else return 0; 
    } 
} 

CREATE OR REPLACE FUNCTION mkdir (p_path IN VARCHAR2) RETURN NUMBER 
AS LANGUAGE JAVA 
NAME 'rtp_java_utils.mkdir (java.lang.String) return java.lang.int'; 

は、最近では、Oracle 12cのデータベースを使用して開始し、現在、私たちはその名前に特殊文字を含むフォルダに問題(例えば「S」、「C」オト「のDJ」)を有するされています。フォルダは作成されますが、特殊文字はありません。代わりにいくつかの文字の組み合わせが表示されます。たとえば、パラメータ "d:/ test/testingščđ"を使用して作成されたフォルダは "testĹÄおよびÄ '"です。したがって、すべての特殊文字に2文字が使用されます。

データベースは、NLS_CHARACTERSET AL32UTF8のバージョン12C(12.1.0.2.0)です。 ファイルシステムは、UTF-8エンコーディングのNTFSです。 OSは、Windowsサーバー2012で 一部のJavaシステム・プロパティは次のとおりです。 - のfile.encoding UTF-8 - UnicodeLittle

をsun.io.unicode.encoding

興味深い、我々は同じ結果(同じ偽フォルダ名)を取得されますNTFSファイルシステムのエンコーディングがUTF-8かWINDOWS-1250かどうかは関係ありません。私たちは両方のオプションを試しました。

私たちの推測では、javaはある文字セットから別の文字セットに与えられたフォルダ名を暗黙的に変換しています。最終結果はfalse folder nameです。しかし、私たちが試したすべてのもの(PLSQLまたはjavaの明示的なフォルダ名の変換、javaのシステムパラメータの変更...)は機能しませんでした。

以前のデータベースではすべてがうまくいっていました(EE8MSWIN1250キャラクタセットのデータベースバージョン10.1.0.5.0、Windows-1250エンコーディングのNTFSファイルシステム)。

誰かがアイデアを持っていますか、何が間違っていますか?

ありがとうございました!

答えて

1

あなたの(投稿されていない)コードのどこかに、UTF8文字列のバイトがISO8859エンコーディングの文字列を構成するために使用されます。

これは、ディレクトリ

test š č đ 
test Å¡ Ä Ä 

はあなたに渡すsctringのバイトを印刷してみc:/tempで作成する

UTF8 : [116, 101, 115, 116, 32, -59, -95, 32, -60, -115, 32, -60, -111] 
ISO8895: [116, 101, 115, 116, 32, 63, 32, 63, 32, 63] 

、それoutout次のスニペット

String s = "test š č đ"; 
System.out.println("UTF8 : " 
     + Arrays.toString(s.getBytes(StandardCharsets.UTF_8))); 
System.out.println("ISO8895: " 
     + Arrays.toString(s.getBytes(StandardCharsets.ISO_8859_1))); 
Files.createDirectories(Paths.get("c:/temp/" + s)); 
byte[] utf8Bytes = s.getBytes(StandardCharsets.UTF_8); 
Files.createDirectories(Paths.get("c:/temp/" 
     + new String(utf8Bytes, StandardCharsets.ISO_8859_1))); 
} 

を参照してください。ストアドファンクション。

関連する問題