Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建UTF16字符串_Java_String_Encoding - Fatal编程技术网

Java 如何创建UTF16字符串

Java 如何创建UTF16字符串,java,string,encoding,Java,String,Encoding,有没有一种方法可以从头开始创建UTF16字符串,或者从一个实际的UTF8字符串创建一个UTF16字符串,而不涉及一些奇怪的“hack”,比如循环遍历每个字符并附加一个00字节以使其成为UTF16字符 理想情况下,我希望能够做到以下几点: String s = new String("TestData".getBytes(), StandardCharsets.UTF_16); 但是这不起作用,因为字符串文本被解释为UTF8。在java中,字符串实例没有编码。它只是-它将字符

有没有一种方法可以从头开始创建UTF16字符串,或者从一个实际的UTF8字符串创建一个UTF16字符串,而不涉及一些奇怪的“hack”,比如循环遍历每个字符并附加一个00字节以使其成为UTF16字符

理想情况下,我希望能够做到以下几点:

String s = new String("TestData".getBytes(), StandardCharsets.UTF_16);

但是这不起作用,因为字符串文本被解释为UTF8。

在java中,
字符串实例没有编码。它只是-它将字符表示为字符,因此没有编码

除了在转换中,编码不是一件事:当你将一堆字符“转换”成一堆字节时,或者反之亦然,除非提供字符集,否则无法执行该操作

以您的代码片段为例。它坏了。你写道:

“TestData”.getBytes()

这是一份汇编。这是不幸的;这是java中的API设计错误;您永远不应该使用这些方法(即:那些默默掩盖涉及字符集的事实的方法)。这是从字符(字符串)到字节的转换。如果您在
getBytes()
方法上阅读javadoc,它会告诉您将使用“平台默认编码”。这意味着这是一个很好的公式,用于编写通过机器上所有测试的代码,然后在运行时失败

想要使用平台默认编码有充分的理由,但我强烈建议您无论如何都不要使用
getBytes()
。如果您遇到这些罕见的情况之一,请编写
“TestData”.getBytes(Charset.defaultCharset())
,以便您的代码明确显示此处正在使用转换的字符集,并且您希望它成为平台默认值

那么,回到您的问题:没有UTF-16字符串这样的东西。(如果这里的“string”是指:
java.lang.string
,而不是指“字节序列”的俚语英语术语)

有一个字节序列,表示UTF-16格式编码的unicode字符。换句话说,java中的“UTF-16字符串”看起来像
byte[]
。不是
字符串

因此,您真正需要的是:

byte[] utf16 = "TestData".GetBytes(StandardCharsets.UTF_16);
你写道:

但这不起作用,因为字符串文本被解释为UTF8

这是代码的属性,而不是字符串的属性。如果您有一些无法更改的代码,这些代码将使用UTF8字符集将字符串转换为字节,并且您不希望发生这种情况,那么请查找源代码并修复它。没有其他解决办法


特别是,试图破解一些东西,比如你有一个带有gobbledygook的字符串,它有一个疯狂的属性,如果你使用这个gobbledygook,使用UTF8字符集将它转换成字节,然后使用UTF16字符集将这些字节转换回字符串,那么你就得到了你真正想要的东西,这是行不通的。对于具有每个字节序列都是可表示的属性的字符集(如ISO_8859_1),这在理论上是可能的(但实际上是一个坏主意),但UTF-8不符合该属性。有些字节序列在UTF-8中只是一个错误,将导致异常。另一方面,不可能手工制作一个字符串,以便用UTF-8将其解码为字节数组,从而生成所需的特定字节序列。

这是否回答了您的问题?特别是公认答案的第二部分,你在这里想做什么?从概念上讲,字符串包含独立于任何编码的字符。编码只有在与字节进行转换时才有意义。@jhamon还值得一提的是,在这个答案上的上浮注释。我们真的不应该这样做。@jhamon这比我的解决方案好,但它看起来仍然是一个相当丑陋的问题解决方案。如果您将DB值作为字符串获取,则可能已经出了问题。Java中只有一种字符串;没有UTF-16字符串或UTF-8字符串。感谢您提供的信息,让我了解了更多。不过还有一个问题,上面创建字节数组的方法在实际数据之前附加了四个字节。这四个字节是干什么的?编辑:啊,这是编码本身,当我将其更改为LE或BE时,它就如我所期望的那样表示:)@David这对UTF-16来说是一个独特的东西,它是一个“字节顺序标记”。几乎所有其他编码都不能做到这一点。从正面来看,任何以0xFE 0xFF(或相反)开头的字节流都可能是UTF-16数据。