[英]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.