簡體   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