如何将UTF8字符串转换为UTF16

6

我通过处理客户端应用程序发送的请求获取了一个UTF8字符串。但是该字符串实际上是UTF16编码的。我该怎么做才能将其转换为我的本地字符串,其中一个字母后面跟着\0字符?我需要将该字符串转换为UTF16编码。

接收到的示例字符串:S\0a\0m\0p\0l\0e(UTF8)
我想要的是:Sample(UTF16)

FileItem item = (FileItem) iter.next();
String field = "";
String value = "";
if (item.isFormField()) {
  try{
    value=item.getString();
    System.out.println("====" + value);
  }

3
一个字符串是一系列字符的序列。编码只在将字符串转换为字节和反之时才有影响(例如在读取或写入文件时)。请展示一些代码,因为你想实现什么不太清楚。 - JB Nizet
不需要进行UTF-16或UTF-8转换的程式相关内容。请仅返回已翻译的文字内容。 - Bhavik Ambani
可能是Java中的编码转换的重复问题。 - Has QUIT--Anony-Mousse
2个回答

21

如果从服务器返回的字节看起来像S\0a\0m\0p\0l\0e,那么它们不是UTF-8编码的。它们是UTF-16编码的。你可以使用以下代码将UTF-16字节转换为Java String

byte[] bytes = ...
String string = new String(bytes, "UTF-16");

如果你知道从服务器传来的字节流的字节序,你可以使用UTF-16LEUTF-16BE作为字符集名称。

如果你已经(错误地)将字节构建为UTF-8格式的字符串,你可以使用以下方法转换为UTF-16:

string = new String(string.getBytes("UTF-8"), "UTF-16");
然而,正如JB Nizet指出的那样,如果起始字节不是有效的UTF-8,则这种往返转换(字节-> UTF-8字符串-> 字节)可能会有损失。

9
如果他已经将字节构造成字符串,就好像它是UTF-8编码的,那么我会说这是一个bug,不应该这样做。并不是每个字节序列都是有效的UTF-8编码,试图将随机字节(或UTF-16字节)转换为UTF-8字符串可能会导致信息丢失。 - JB Nizet

-1

我提出以下解决方案:

NSString *line_utf16[ENOUGH_MEMORY_SIZE];

line_utf16= [NSString stringWithFormat: @"%s", line_utf8];

ENOUGH_MEMORY_SIZE 至少是 line_utf8 内存使用量的两倍以上

我认为需要动态或静态分配line_utf16的内存大小至少是line_utf8的两倍。

如果您遇到类似的问题,请添加几句话!


问题是关于如何在Java中进行转换。 - skomisa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接