簡體   English   中英

Java為什么不能在UTF-8文件中讀取此Unicode字符?

[英]Why can't Java read this unicode char in UTF-8 file?

“ unicode.txt” UTF-8文件

𫢹アफਸᙡşüabÇİÜ⏩ア

第一個字符有4個字節。 當我運行此代碼時,我無法獲得期望的輸出

InputStream in = new FileInputStream("unicode.txt");
InputStreamReader inReader = new InputStreamReader(in, "UTF-8");
char ch = (char)inReader.read();
System.out.println(ch); // Writes '?' character to the console. Why ?

為什么此代碼未在控制台中寫入“𫢹”字符? 我該怎么寫呢?

我的默認編碼:

System.out.println(System.getProperty("file.encoding")); // output: "UTF-8"
System.out.println(Charset.defaultCharset()); // output: "UTF-8"

我認為,問題是char數據類型。

謝謝。

char數據類型基於原始Unicode規范,該規范將字符定義為固定寬度的16位實體。 此后,對Unicode標准進行了更改,以允許其表示需要超過16位的字符。 Unicode代碼點的范圍現在是U + 0000到U + 10FFFF。 從U + 0000到U + FFFF的字符集稱為基本多語言平面(BMP),而代碼點大於U + FFFF的字符稱為補充字符。 因此,char值表示BMP代碼點,包括代理代碼點或UTF-16編碼的代碼單元。 一個int值表示所有Unicode代碼點,包括補充代碼點。

特別是,請勿編寫假定原始類型char(或Character對象)的值完全代表Unicode代碼點的代碼。

(來自https://wiki.sei.cmu.edu/confluence/plugins/servlet/mobile?contentId=88487813#content/view/88487813

換句話說,您偶然發現了一個Unicode字符,該char由Java使用的可變長度UTF-16編碼中的多個BMP代碼單元(即char )表示。

暫無
暫無

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

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