当前位置: 首页 > 知识库问答 >
问题:

用java从Oracle数据库创建unicode字符文件夹

祝高阳
2023-03-14
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'; 

最近,我们开始使用Oracle12c数据库,现在我们遇到了文件夹名称中包含特殊字符的问题(例如“š"、”č"、“ot”\“)。虽然创建了文件夹,但没有特殊字符--相反,显示了一些字符组合。例如,使用参数“d:/test/testščé”,创建的文件夹是“testé”。因此,每个特殊字符使用2个字符。

数据库是版本12C(12.1.0.2.0),带有NLS_CHARACTERSET al32utf8。文件系统是使用UTF-8编码的NTFS。操作系统是Windows Server2012。一些Java系统属性是:-file.encoding utf-8-sun.io.unicode.encoding UnicodeLittle

有趣的是,无论NTFS文件系统编码是UTF-8还是Windows-1250,我们都会得到相同的结果(相同的假文件夹名)。我们两种选择都试过了。

我们的猜测是,java正在对给定文件夹名从一个字符集到另一个字符集进行隐式转换,最终结果是false文件夹名。但是我们所尝试的一切(在PLSQL或java中显式地转换文件夹名,在java中更改系统参数...)没起作用。

在我们以前的数据库上,一切都很好(数据库版本10.1.0.5.0使用EE8MSWIN1250特征集,NTFS文件系统使用windows-1250编码)。

有没有人有个主意,出了什么问题?

共有1个答案

江育
2023-03-14

在您的(未发布的)代码中的某个地方,UTF8字符串的字节用于构造具有ISO8859编码的字符串。

请参阅以下片段

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)));
}

外出

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]
test š č đ
test Å¡ Ä Ä
 类似资料:
  • 问题内容: 我想在Java中显示Unicode字符。如果我这样做,则效果很好: 符号等于“∂”。这是我想要的。 问题是我知道Unicode号,因此需要从中创建Unicode符号。我(对我)尝试了显而易见的事情: 但是,在这种情况下,符号等于“ \ u2202”。那不是我想要的 如果我知道符号的Unicode编号(但只能在运行时-我不能像第一个示例那样对其进行硬编码),如何构造该符号? 问题答案:

  • 我在使用文本文件创建SQLite数据库时遇到了问题。我应该创建一个成员列表,其中包含以下内容:(成员)号、名字、姓氏、地址和电话号码(如果有的话)。我正在使用方法创建db,但我似乎无法让它正常工作。 文本文件是这样填充的('...'应该意味着列表中还有其他文件): 正如你可能看到的,一些成员没有电话号码,我认为这是导致db无法填充的原因。我之所以相信这一点,是因为我试图用所有信息制作自己的列表,这

  • 问题内容: 我有一个像这样的文本文件: 我想要一个像这样的字符串数组: 我试过了 : 任何人都可以帮助我…。所有答案将不胜感激… 问题答案: 根据您的输入,您就快到了。您错过了循环中保持从文件读取每一行的关键点。由于您不事先知道文件中的总行数,因此请使用集合(动态分配的大小)来获取所有内容,然后将其转换为的数组(这是您想要的输出)。 像这样: 那么输出()将是: 这不是最佳解决方案。其他更 聪明的

  • 我很困惑,为什么我不应该用UTF-8编码unicode文本进行比较,而其他文本(要比较)已经用UTF-8编码了? 但是,当我用UTF-8编码并尝试将其与进行比较时,结果是。代码是 所以我的疑问是,当两个字符串都是相同的,并且都是用UTF-8编码的时候,为什么上面的比较失败了?结果应该为。 但是,在第一种情况下,当比较不同的编码字符串时--一种是UTF-16(Java默认的字符串编码方式),另一种是

  • 问题内容: 我有一个字符串类型为\ u00C3的文件。我想创建一个由Java中的unicode表示的unicode字符。我尝试过但找不到。救命。 编辑:当我阅读文本文件时,字符串将包含“ \ u00C3”,而不是Unicode字符,而是ASCII字符’'‘u’‘0’‘0’‘3’。我想从该ASCII字符串形成unicode字符。 问题答案: 我在网上的某个地方捡到了这个:

  • 问题内容: 我正在尝试使用JDBC在oracle数据库上创建Java源对象。 我要创建的源如下: 我已经尝试过使用execute方法,这给了我。 当我尝试在普通对象上使用execute方法时,出现错误:“ 有人知道我在做什么错吗?似乎在Google上也找不到任何内容。 编辑:这是我用来尝试执行脚本的代码(字符串包含您可以在上面看到的脚本,变量是对象。 如果我尝试使用Statement就是这样: 问