[英]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
文件,您應該看到您的預期。
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.