oracle和java之间的UTF-8差异

oracle和java之间的UTF-8差异,java,oracle,unicode,utf-8,Java,Oracle,Unicode,Utf 8,oracle数据库和Java之间有以下unicode差异 如果我在oracle sql developer中运行以下命令: select unistr('\008C') from dual; 我得到以下unicode字符: 但是,如果我尝试在java中执行相同类型的unicode代码到字符串转换: String s1 = new String("\u008C"); 结果我得到一个空字符 我知道我可以使用\u0152字符来正确显示java和oracle中所需的字符,但我想了解为什么会有这种差

oracle数据库和Java之间有以下unicode差异

如果我在oracle sql developer中运行以下命令:

select unistr('\008C') from dual;
我得到以下unicode字符:

但是,如果我尝试在java中执行相同类型的unicode代码到字符串转换:

String s1 = new String("\u008C");
结果我得到一个空字符

我知道我可以使用\u0152字符来正确显示java和oracle中所需的字符,但我想了解为什么会有这种差异。我试着玩我的字体,但没有得到任何像样的结果。谢谢。

这毫无意义:

String s1 = new String("\u008C".getBytes(), "UTF-8");
如果幸运的话,您的默认编码将是UTF-8,您将获得:

s1.equals("\u008C") == true
这是因为
.getBytes()
将默认为系统编码。您可以有效地从UTF-8编码到未知(但可发现)编码和解码

如果你运气不好,你的默认编码将是其他东西,你将有emojibake你的字符串

如果你想说的是:

 System.out.println( "\u008C" );
不生成任何内容,这是因为“部分向后行”是一个控制字符。i、 这是非印刷品。它不应该被打印出来。似乎有些用户界面会自动将这个字符表示为“拉丁大写连字OE”(U+0152),这取决于实现

例如,如果我使用
Œ在其中,它在Chrome中显示为Œ;。将此字符复制到剪贴板并粘贴到文档中,然后将其另存为UTF-16 BE。十六进制转储文件,您将看到:

0000000 01 52 
“拉丁大写连字OE”的Unicode码点/UTF-16编码。因此,Oracle SQL Developer工具只是通过显示“拉丁文大写连字OE”来欺骗/帮助您。

String.getBytes()
使用平台默认编码将字符串转换为字节序列。这相当于:

String encoding = System.getProperty("file.encoding");
"\u008C".getBytes( encoding );
此函数的结果取决于您使用的编码

例如,在我的电脑上有cp1250代码页,我得到以下结果:

    System.out.println( System.getProperty("file.encoding") );
    byte b[] = "\u008C".getBytes();
    for( byte bb: b)System.out.format("%x\n", bb);
    -------
    Cp1250
    3f
如您所见,Œ字符被转换为一个字节:3f,这在cp1250中是?性格我相信这是因为cp1250中没有Œ字符,所以CharsetEncoder(toBytes()方法使用它将unicode字符串转换为特定字符集)将Œ转换为?在这种情况下。

有关更多详细信息,请参见此处:

如您所见,java代码正在将unicode字符串转换为平台编码,然后结果(作为字节数组)再次被视为unicode-但实际上它是使用其他编码进行编码的。

这毫无意义。

您如何测试Java的输出?你要把它打印到哪里?我的错,我复制了错误的代码行(在这个arvo执行了许多测试之后),我改变了我的问题,这实际上只是因为\u008C字符在Java和oracle中没有显示相同的内容
String s1=新字符串(“\u008C”,“UTF-8”)也无效
“\u008C”
是一个Unicode点,不是UTF-8编码的,因此不需要解码。您只需执行以下操作:
String s1=“\u008C”
。然后,告诉我们您是如何看待这个输出的,这一点很重要。控制台,网页,文本文件?我是个白痴,我在测试中也没有编码。。。无论如何,我在eclipse调试、系统输出和使用jaxrs cxf接口时遇到了问题,在执行curl请求时遇到了一个奇怪的字符。谢谢你的帮助。那么就解决了?