簡體   English   中英

Java InputStreamReader無法讀取特殊(土耳其語)字符

[英]Java InputStreamReader Can not read Special(Turkish) Characters

在下面您可以看到我的代碼;

final BufferedReader br = new BufferedReader(
                new InputStreamReader(new FileInputStream(f),"UTF-8"));// tried also "iso-8859-9"
String strLine;
while ((strLine = br.readLine()) != null) {
    total += "\n" + strLine;
}
br.close();

下面是輸出..我該怎么辦?

insan n sec ld g combobox

或U + FFFD字符是Unicode定義為“替換字符”的特殊字符,當遇到無法識別的字符或字節數據格式錯誤且無法讀取字符時顯示的字符。

您使用的InputStreamReader構造函數不允許您在數據格式錯誤或無法識別字符時指定行為。 它假定您希望在出現無法識別的字符或字節數據格式錯誤時使用“替換字符”的默認行為,這可能就是您所看到的。

如果檢查輸出,發現土耳其字符不在那里,但已被“替換字符” U + FFFD替換,則可以更改行為以引發異常,而不是使用替換字符-實際的異常會導致更容易檢測何時數據使用錯誤的字符集。

若要指定此不同的行為,請使用此版本的InputStreamReader

public InputStreamReader(InputStream in, CharsetDecoder dec)

對於CharsetDecoder ,傳入

charset.newDecoder().onMalformedInput(CodingErrorAction.REPORT)
        .onUnmappableCharacter(CodingErrorAction.REPORT)

charset是您選擇的字符集,例如StandardCharsets.UTF_8

這將導致引發異常,而不是插入替換字符。

如果您仍然看到替換字符並且未引發任何異常,則很顯然問題出在查看輸出的方式上。

那么實際的文件編碼是什么? 打開一個十六進制編輯器,查看insan n的字節值(尤其是斷字符)。 然后,當您獲得字節值時,就可以找到實際的編碼。 現在,您只是隨機嘗試了兩種錯誤的編碼。

暫無
暫無

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

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