繁体   English   中英

从US-ASCII编码的字符串中获取UTF-8编码

[英]Getting UTF-8 encoded from US-ASCII encoded string

我有一个用UTF-8编码的字符串“Château”,它被转换为“ Ch ?? teau”(在我的应用程序的基本库中)为US-ASCII格式。

现在,我想从“ U-ASCII”转换后的字符串“ Ch ?? teau”中获取原始字符串“Château”。 但是,我无法使用下面的代码来得到它。

StringBuilder masterBuffer = new StringBuilder();
byte[] rawDataBuffer = (Read from InputStream) // say here it is "Château"
String rawString = new String(rawDataBuffer, "UTF-8");
masterBuffer.append(rawString);
onMessageReceived(masterBuffer.toString().getBytes()) => Here, getBytes() uses the platform's default charset 'US-ASCII.

我的应用程序收到了US-ASCII编码的字节数组。 在应用程序方面,即使我尝试从中获取UTF-8字符串,也没有用。 转换尝试仍给出“ Ch ?? teau”。

String asciiString = "Ch??teau";
String originalString = new String(asciiString.getBytes("UTF-8"), "UTF-8");
System.out.println("orinalString: " + originalString);

“ originalString”的值仍为“ Ch ?? teau”。

这是正确的方法吗?

谢谢,

你不能 通过转换为US-ASCII,您丢失了信息。 您无法找回丢失的东西。

您的代码正在接收UTF-8编码的字节数组,将其正确转换为Java String ,然后将其转换为ASCII编码的字节数组。 ASCII不支持â字符,这就是为什么将它们转换为? 转换完成后,将无法返回。 ASCII是UTF-8的子集, ? 在ASCII中也是? 在UTF-8中。

解决方案是从一开始就停止转换为ASCII。 您应该改回为UTF-8:

StringBuilder masterBuffer = new StringBuilder();
byte[] rawDataBuffer = ...; // Read from InputStream
String rawString = new String(rawDataBuffer, "UTF-8");
masterBuffer.append(rawString);
onMessageReceived(masterBuffer.toString().getBytes("UTF-8"));

至少以这种方式,对于真正的ASCII字符,接收者将永远不会知道区别(因为ASCII是UTF-8的子集),并且不再会丢失非ASCII字符。 接收者只需要知道期望使用UTF-8而不是ASCII。 并且,您的代码将更加可移植,因为您将不再依赖于特定于平台的默认字符集(默认情况下,并非所有平台都使用ASCII)。

当然,在您的示例中,您的StringBuilder是多余的,因为您没有在其中添加任何其他内容,因此您可以删除它:

byte[] rawDataBuffer = ...; // Read from InputStream
String rawString = new String(rawDataBuffer, "UTF-8");
onMessageReceived(rawString.getBytes("UTF-8"));

然后, String变得多余:

byte[] rawDataBuffer = ...; // Read from InputStream
onMessageReceived(rawDataBuffer);

如果onMessageReceived()希望将字节作为输入,为什么还要浪费额外的开销将字节转换为String再转换为字节呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM