簡體   English   中英

編碼-將US-ASCII轉換為UTF-8?

[英]Encoding - Convert US-ASCII to UTF-8?

我在Linux機器上的默認字符集是US-ASCII。 如果我用變音符號上傳文件,則編碼有問題。

在示例中,我創建了一個名為standü.png的文件。 如果我做

new String(f.getName().getBytes(Charset.defaultCharset()),"UTF-8");

我的結果是stand..png。 但我想要standü.png(帶有變音符號)

//Default Charset is US-ASCII
    System.out.println(Charset.defaultCharset());

    String s = "standü.png";

    File f = new File(s);

    String newstr = new String(f.getName().getBytes(Charset.defaultCharset()),"UTF-8");
    System.out.println(newstr);

我的輸出是:

US-ASCII
stand?.png

我在美國舊金山附近的Mac操作系統上,正在運行各種Java 8花園。當我按原樣運行您的代碼時,我得到了這個變音符號:

UTF-8
standü.png

我有點想得到這個,因為我從過去的經驗中知道我的默認字符集是某種可以保留外來字符的unicode。 為什么使用默認的字符集ASCII? 那似乎是你的問題。

正如我在評論中所說,我認為您可以將“ Charset.defaultCharset()”更改為“ Charset.forName(” UTF-8“)以解決您的問題。我不確定,但是如果將其設置為“ Charset.forName(“ ASCII”),然后我得到輸出。 因此,這似乎應該為您解決問題。

因此,只需更改:

String newstr = new String(f.getName().getBytes(Charset.defaultCharset()),"UTF-8");

至:

String newstr = new String(f.getName().getBytes(Charset.forName("UTF-8"),"UTF-8");

此外,這不會給您帶來變音符號:

String newstr = f.getName();
System.out.println(newstr);

如果我理解正確的話,那么一切都會一直保持unicode。 當您必須將名稱轉換為字節流時,就會出現問題。 如果您不必這樣做,則可以。 如果這樣做的話,請顯式使用UTF-8而不是默認字符集,我想您也會很好。

如果要在文件系統上創建一個名稱包含非ASCII字符的文件,則實際上不需要任何轉換。

import java.io.File;
import java.io.IOException;

public class Test {

  public static void main(String[] args) throws IOException {
    new File("ü").createNewFile();
  }
}

這實際上將在我的文件系統上創建一個名為“ü”的文件。 請注意,我在Linux上,文件名實際上是一個字節序列(在這種情況下,它將是0xC3 0xBC)。 操作系統不會將文件名解釋為字符串。 但是,像ls這樣的程序。 他們將用來解釋序列的內容取決於語言環境。

$ LC_ALL=en_US.UTF-8 ls 
ü
$ LC_ALL=C ls 
''$'\303\274'

也要注意如何確定編碼正確性。 當您在控制台上輸出內容時,那里還會有一種編碼,如果未正確設置,您可能會得出錯誤的結論。

您需要使用適當的系統屬性file.encoding啟動JVM,並將其設置為文件系統中文件名的編碼。 由於類似UNIX的操作系統上的文件名通常是字節字符串而不是字符串,因此您將不得不嘗試正確的文件名: UTF-8 (可能)或ISO-8859-1 (不太可能)。 其中之一應該起作用。

該屬性的名稱未在官方文檔中列出,但是當您列出這些屬性時,將很容易獲得其當前值。

該屬性可能需要非常早地設置,理想情況下,通過-Dfile.encoding=UTF-8命令行選項進行設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM