2017-02-25 79 views
1

我有一個帶有字符串String s="P�rsh�ndetje bot�!";的.java文件。在idea intellij中更改編碼不起作用

當我打開Notepad++此文件並更改編碼爲ISO-8859-1它表明相應的字符串:"Përshëndetje botë!",但如果我打開思路的IntelliJ和變化編碼爲ISO-8859-1的文件,它給了我一個警告如何不能轉換某些符號,然後用? mark:"P?rsh?ndetje bot?!"替換那些符號。

這是怎麼發生的?爲什麼Notepad ++能夠轉換文件,而想法不是?

+2

爲什麼不直接使用UTF-8?也許Intellij與您選擇的編碼有問題? –

+0

@bureaquete,UTF-8不能使用此文件。 Notepad ++和Intellij都具有默認的UTF-8,並且要顯示的字符需要更改。 – parsecer

+1

你使用文件>文件編碼> ISO-8859-1>轉換嗎? 通過這些步驟,我的intellij –

回答

1

我相信在IDEA(默認編碼爲UTF-8)中存在一些錯誤,因爲當您轉換包含有效ISO-8859-1編碼字符的文件並將文件編碼更改爲ISO-8859-1它會把它弄糟。它弄糟的特定代碼點是ë。由於某種原因,它用\ufffd代替它,而其正確的代碼點是\u00eb。這是在你的編輯器中顯示爲character的字符。

我的建議是隻使用UTF-8而不是將其更改爲ISO-8859-1。 UTF-8向後兼容ISO-8859-1,您可以使用操作系統上的IME(它似乎是Windows)編寫該字符串。我不確定如何在Windows上執行此操作,但在Mac上,我使用U +鍵盤 enter image description here

然後在保持按下ALT鍵的同時將此字符添加爲00eb。然後,它顯示正確:

enter image description here

3

我不知道,但有可能的是,當你第一次打開文件時,它讀成UTF-8和無效字節序列變成了Unicode replacement character,那麼當您嘗試轉換爲ISO-8859-1時,它會嘗試轉換Unicode替換字符,但在ISO-8859-1中沒有該值,因此將其轉換爲?

(即使像「ERS」文本可以以Unicode來表示並且因此UTF-8「 ERS」的ISO-8859-1編碼是EB7273這是一個三字節UTF-的起始字節8序列,但接下來的兩個字節不是連續字節,所以將其視爲UTF-8的程序會認爲這些重音字符是無效的。)

我認爲您需要將IntelliJ打開爲ISO-8859 -1,而不是先打開它作爲UTF-8,然後嘗試轉換爲ISO-8859-1。 (當您在Notepad ++中切換編碼時,它必須返回到文件的原始字節並將它們解釋爲ISO-8859-1,而不是試圖通過將無效字節更改爲已更改的內容轉換爲ISO-8859-1替換字符)。

請注意,ë是一個完全有效的Unicode字符。它可以表示爲U + 00EB,拉丁字母e,帶有分音符,或者作爲兩個代碼點,U + 0065和U + 0308,拉丁小寫字母e加上合併分音。但是U + 00EB將以UTF-8編碼爲雙字節序列C3AB,並且對於U + 0065 U + 0308,「e」將被編碼爲自身,65,並且U + 0308將被編碼爲CC88

所以 「E」 在UTF-8必須是C3AB65CC88。它不能是EB

+0

你能解釋一下爲什麼當我將文件轉換回UTF-8時,'ë'字符不會再被問號替換嗎?如果在UTF-8中沒有'''''',那怎麼可能? 爲什麼Intellij的輸出窗口正確顯示字符,是不是輸出用UTF-8編碼? – parsecer

+0

UTF-8中有一個'ë',它不能像ISO-8859-1那樣被編碼爲單個字節。我已經更新了答案,並解釋了兩種方法''可以用UTF-8正確表示。 –

+0

謝謝......但這是怎麼發生的?我的意思是,ISO-8859-1 - > UTF-8(當文件第一次打開時)會損壞'''',然後當文件重新加載爲ISO-8859-1:ISO-8859- 1 - > UTF-8正常工作... – parsecer