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