用Java错误打印非鸡蛋字符

时间:2019-01-16 07:59:00

标签: java unicode utf-8 output inputstream

我认为这只是Python 2的问题,但现在与Java(Windows 10,JDK8)都遇到了类似的问题。

到目前为止,我的搜索结果几乎无法解决。

我从“ stdin”输入流中读取了以下值:// Glogal variable private lateinit var getShowsNetworkCall: Call<List<Show>> void loadShows() { // You can add parameters to the call here getShowsNetworkCall = service.getShows() getShowsNetworkCall.enqueue(object: Callback<List<Show>>) { override fun onResponse(call: Call<List<Trip>>, response: Response<List<Trip>>) {...} override fun onFailure(call: Call<List<Show>>, t: Throwable) {...} } } override fun onCleared() { super.onCleared() getShowsNetworkCall?.cancel() } 。当我将其打印到控制台时,得到以下信息:Viļāni

相关代码段如下:

Vi????ni

关于我的问题的进一步扩展如下:

我读取了包含以下两行的文件: BufferedReader in = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)); ArrayList<String> corpus = new ArrayList<String>(); String inputString = null; while ((inputString = in.readLine()) != null) { corpus.add(inputString); } String[] allCorpus = new String[corpus.size()]; allCorpus = corpus.toArray(allCorpus); for (String line : allCorpus) { System.out.println(line); } 当我从磁盘读取并输出到第二个文件时,得到以下输出:

を Sōten_Kōro 当我使用 ã‚’ SÅ�ten_KÅ�ro 从stdin中读取文件时,得到以下输出:

cat testinput.txt | java UTF8Tester

两者显然都是错误的。我需要能够将正确的字符打印到控制台和文件。我的示例代码如下:


???
S??ten_K??ro

真的停留在这里,我们将不胜感激!提前致谢。保罗

1 个答案:

答案 0 :(得分:1)

  • System.in/out将使用默认的Windows字符集。
  • Java String将在内部使用Unicode。
  • FileReader / FileWriter是使用默认字符集的旧实用程序类,因此它们仅适用于不可移植的本地文件。

您看到的错误是一个特殊字符,它是两个字节的UTF-8序列,但是每个(特殊UTF-8)字节都被解释为默认的单字节编码,但是没有值,因此两次{{1 }}替换。

  • 要求该字符可以在System.in上的默认字符集中输入。
  • 然后从默认字符集转换字符串。
  • 将其写入UTF-8文件需要指定UTF-8。

因此:

?

要检查您当前的计算机系统是否使用日语:

    BufferedReader stdinReader = new BufferedReader(new InputStreamReader(System.in));
    String[] stdinData = readLines(stdinReader);
    printToFile(stdinData, "stdin_out.txt");

    Path path = Paths.get("testinput-utf8.txt");
    List<String> lines = Files.readAllLines(path); // Here the default is UTF-8!

    Path path = Paths.get("testinput-winlatin1.txt");
    List<String> lines = Files.readAllLines(path, "Windows-1252");

    Files.write(lines, Paths.get("file_out.txt"), StandardCharsets.UTF_8);

看不到System.out.println("Hiragana letter Wo '\u3092'."); // Either を or ?. 到默认系统编码的转换。 を是U + 3092,用\ u3092进行u编码为ASCII。

要在Windows下创建UTF-8文本,

?

在这里,我使用了一个丑陋的(通常不需要)的BOM标记char Files.write(Paths.get("out-utf8.txt"), "\uFEFFHiragana letter Wo '\u3092'.".getBytes(StandardCharsets.UTF_8)); (零宽度的空格),它将使Windows记事本识别UTF-8中的文本。