簡體   English   中英

在java中讀取unicode字符

[英]Reading unicode character in java

當我分配一個unicode字符串時,我對java有點新鮮

  String str = "\u0142o\u017Cy\u0142";
  System.out.println(str);

  final StringBuilder stringBuilder = new StringBuilder();
  InputStream inStream = new FileInputStream("C:/a.txt");
  final InputStreamReader streamReader = new InputStreamReader(inStream, "UTF-8");
  final BufferedReader bufferedReader = new BufferedReader(streamReader);
  String line = "";
  while ((line = bufferedReader.readLine()) != null) {
      System.out.println(line);
      stringBuilder.append(line);
  }

為什么在兩種情況下結果都不同,文件a.txt也包含相同的字符串。 但是當我打印文件的輸出時,它打印z\ło\ży\ł而不是實際的unicode字符。 如果我想將文件內容也打印為正在打印的字符串,我知道如何做到這一點。

你的代碼應該是正確的,但我想文件“a.txt”不包含用UTF-8編碼的Unicode字符,而是包含轉義字符串“\\ u0142o \\ u017Cy \\ u0142”。

請使用支持UTF-8的編輯器檢查文本文件是否正確,例如Windows上的最新版本的Notepad或Notepad ++。 或使用您喜歡的十六進制編輯器編輯它 - 它不應包含反斜杠。

我嘗試用“€”作為文件的UTF-8編碼內容並正確打印。 請注意,並非所有Unicode字符都可以打印,具體取決於您的終端編碼(在Windows上真的很麻煩)和字體。

Java解釋了源代碼中的unicode轉義 ,例如你的 ,就好像你實際上已經將該字符(帶筆划的拉丁小寫字母L)輸入到源代碼中一樣。 Java 解釋Unicode轉義字符,它從文件中讀取。

如果你把你的String str = "\ło\ży\ł"; 並將其寫入Java程序中的文件a.txt ,然后在編輯器中打開文件,您將在文件中看到字符本身, 而不是 \\ uNNNN序列。

如果您隨后使用原始發布的程序並讀取 a.txt文件,您應該看到您的預期。

您可以使用Apache Commons Lang

import org.apache.commons.lang3.StringEscapeUtils;

// open the file as ASCII, read it into a string, then
String escapedStr; // = "\u0938\u093e\u0935\u0928@\u0928\u093f\u0915\u094d\u0938\u0940.\u092d\u093e\u0930\u0924"
// (to include such a string in a Java program you would have to double each \)

String hindiStr = StringEscapeUtils.unescapeJava( escapedStr );

System.out.println(hindiStr);

聽起來好像你的文件字面上包含文本z\ło\ży\\u014\u003c/code> ,即其中包含Unicode轉義序列。

可能有一個用於解碼這些文件的庫,但你可以自己做 - 根據Java語言規范 ,轉義序列的格式始終為\\uxxxx ,因此你可以獲得字符的4位十六進制值xxxx ,將其轉換為使用Integer.parseInt整數,將其轉換為字符,最后用字符替換整個\\uxxxx序列。

那么,你想要unicode unicode代碼點? 沒有可用的公共API。 java.util.Properties有一個loadConvert()方法,它正是這樣做的,但它是private 檢查Java源代碼,了解您要重用的情況。 它通過簡單的解析進行轉換。 我不會使用正則表達式,因為在非常特殊的情況下這很容易出錯。

或者你可能應該使用java.util.Properties或其i18n對應的java.util.ResourceBundle.properties文件而不是普通的.txt文件。

也可以看看:

我認為它只是“UTF8”而不是“UTF-8”。

我在這里看到了它: 來源

我在這個答案中發布了Java代碼到unescape(“descape”?)這樣的東西和許多其他東西。

您使用過FileInputStream並且是字節代碼閱讀器而不是字符閱讀器。 請嘗試使用FileReader

就像是:

BufferedReader inputStream = new BufferedReader(new FileReader(“C:/a.txt”));

然后你可以使用面向行的I / O BufferedReader來讀取每一行。 FileInputREader是您應該避免的低級I / O. 您將字符寫入文件而不是字節,最好的方法是使用字符流。 用於寫入和讀取,除非您需要寫入字節/二進制數據。

暫無
暫無

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

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